在C++中,类的权限分为公有、私有和保护三种。这些权限控制了类的成员(数据成员和成员函数)对外部代码的可见性和访问性。
-
公有(public)权限:
在公有权限下声明的成员可以被类的外部代码直接访问;公有成员在类的派生类中仍然可以被访问。 -
私有(private)权限:
在私有权限下声明的成员对于外部代码是不可见的;只有类的成员函数可以访问私有成员;私有成员不能被派生类访问,即使是公有继承也是如此。 -
保护(protected)权限:
在保护权限下声明的成员对于外部代码是不可见的;类的派生类可以访问保护成员;保护成员在派生类中仍然是保护的,对于外部代码是不可见的。
在 C++类的继承中,也对应着三种继承权限,分别是公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。这些权限决定了派生类如何继承基类的成员以及外部访问的方式。
-
公有继承(public inheritance):
在公有继承中,基类的公有成员在派生类中仍然是公有的,基类的保护成员在派生类中仍然是保护的,基类的私有成员不会被派生类继承。
派生类对象可以直接访问基类的公有成员,但不能访问基类的私有成员。
外部代码可以访问派生类对象中的公有成员,但不能访问保护成员或私有成员。
//基类 class Animal { public:Animal();~Animal(); int m_nAge; private:int testA; protected:int testB; }; //派生类(公有继承) class Cat : public Animal { public:Cat();~Cat();}
上述代码中的派生类就属于通过对基类进行公有继承得到,此时
Animal
类中的公有成员被继承至Cat
类中也是公有成员,Animal
类的保护成员在Cat
类中仍然是保护的,但是Animal
类的私有成员不会被Cat
类继承。如此时我在Cat
类中对基类中的私有成员TestA
和保护成员TestB
进行设置/访问,那么此时可以发现私有成员TestA
无法访问,保护成员TestB
可以正常访问;是因为私有成员并没有被继承。总结:
公有继承:基类 派生类公有成员 ---> 公有成员保护成员 ---> 保护成员私有成员 无法继承
-
保护继承(protected inheritance):
在保护继承中,基类的公有和保护成员在派生类中都变成了保护成员,类的私有成员依然不会被派生类继承。
派生类对象可以访问基类的公有和保护成员,但外部代码无法直接访问派生类对象的成员。
外部代码无法访问派生类对象中的任何成员。
保护继承:
//基类 class Animal { public:Animal();~Animal(); int m_nAge; private:int testA; protected:int testB; }; //派生类(保护继承) class Cat : protected Animal { public:Cat();~Cat(); }
派生类
Cat
:使用保护继承方式继承自Animal
类,意味着基类Animal
的公有和保护成员在Cat
类中都变成了保护的。外部无法直接访问Cat
对象的成员。Cat
类中可以访问继承自Animal
的公有和保护成员。
总结:
保护继承基类 派生类公有成员 ----> 保护成员保护成员 ----> 保护成员私有成员 无法继承
3.私有继承(private inheritance):
在私有继承中,基类的公有和保护成员在派生类中都变成了私有的,类的私有成员依然不会被派生类继承。
派生类对象可以访问基类的公有和保护成员,但外部代码无法直接访问派生类对象的成员。
外部代码无法访问派生类对象中的任何成员。
私有继承:
//基类
class Animal
{
public:Animal();~Animal();
int m_nAge;private:int testA;
protected:int testB;
};
//派生类
class Cat : private Animal
{
public:Cat();~Cat();
}
派生类 Cat
:采用私有继承方式继承自 Animal
类,这意味着基类 Animal
的公有和保护成员在 Cat
类中都变成了私有的。Cat
类中可以访问继承自 Animal
的公有和保护成员,但外部代码无法访问。
总结:
私有继承
基类 派生类公有成员 ---> 私有成员保护成员 ---> 私有成员私有成员 无法继承