C++访问控制符/继承访问控制符:private/protected/public

三种访问控制符

C++访问控制符有三个privateprotectedpublic

简单可以归为以下两种描述

1)一个类友元(包含友元函数或者友元类的成员函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。

2)除去友元外,private成员只有该类自身的成员函数可以访问(派生类都不可以),protected成员只有该类及其派生类的成员函数可以访问,public成员该类及其派生类的成员函数和对象都可以访问。

派生类继承方式的影响

类的继承方式有三种:privateprotectedpublic

private属性不能被继承。

使用private继承,父类的protectedpublic属性在子类中变为private

使用protected继承,父类的protectedpublic属性在子类中变为protected

使用public继承,父类中的protectedpublic属性不发生改变;

举一个简单的例子

// inherit.h
#pragma once

class Base {
public:
	int pub_mem = 1;
protected:
	int pro_mem = 2;
	int getPriMemBase() { return pri_mem; }
private:
	int pri_mem = 3; // private成员不能被继承,因此定义了一个protected的方法getPriMemBase供派生类获取private成员的值
};

class PubDerive : public Base { // public继承
public:
	int getPubMem() { return pub_mem; }
	int getProMem() { return pro_mem; }
	// int getPriMem() { return pri_mem; } // error: pri_mem 不可访问
	int getPriMem() { return getPriMemBase(); }
};

class ProDerive : protected Base { // protected继承
public:
	int getPubMem() { return pub_mem; }
	int getProMem() { return pro_mem; }
	// int getPriMem() { return pri_mem; } // error: pri_mem 不可访问
	int getPriMem() { return getPriMemBase(); }
};

class PriDerive : private Base { // private继承
public:
	int getPubMem() { return pub_mem; }
	int getProMem() { return pro_mem; }
	// int getPriMem() { return pri_mem; } // error: pri_mem 不可访问
	int getPriMem() { return getPriMemBase(); }
};

// main.cpp
#include 
#include "inherit.h"

int main()
{
	Base b;
	PubDerive pubd;
	ProDerive prod;
	PriDerive prid;
	std::cout << pubd.getPubMem() << " " << pubd.getProMem() << " " << pubd.getPriMem() << " " << std::endl;
	std::cout << pubd.pub_mem << std::endl;
	// std::cout << pubd.pro_mem << std::endl; // 实例不能访问protected成员
	// std::cout << pubd.pri_mem << std::endl; // 实例没有pri_mem成员,private成员不能被继承
	std::cout << prod.getPubMem() << " " << prod.getProMem() << " " << prod.getPriMem() << " " << std::endl;
	// std::cout << prod.pub_mem << std::endl; // 实例不能访问protected成员->因protected继承,pub_mem的属性由public变为protected
	// std::cout << prod.pro_mem << std::endl; // 实例不能访问protected成员
	// std::cout << prod.pri_mem << std::endl; // 实例没有pri_mem成员,private成员不能被继承
	std::cout << prid.getPubMem() << " " << prid.getProMem() << " " << prid.getPriMem() << " " << std::endl;
	// std::cout << prid.pub_mem << std::endl; // 实例不能访问private成员->因private继承,pub_mem的属性由public变为private
	// std::cout << prid.pro_mem << std::endl; // 实例不能访问private成员->因private继承,pro_mem的属性由protected变为private
	// std::cout << prid.pri_mem << std::endl; // 实例没有pri_mem成员,private成员不能被继承
	return 0;
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

14 + 9 =

53 + = 56