三种继承方式:
(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
(2)private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
(3)protected(保护性继承):继承时基类中各成员属性均变为protected,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
注意点:
1. 私有继承和保护继承指针均不能用基类指针表示,即无法实现多态性。
class CBase
{...
};
class CChild : private/protected CBase
{...}
CBase* pChild = new Child(); //错误
2. 基类虚函数访问级别为public, 子类中重写并将访问级别改为private, 通过多态性仍旧可以访问子类中的私有虚函数。由此可得,多态性的访问级别与封装性的访问级别并不是属于同一个范畴,多态性只以基类虚函数的访问级别为准。
class CBase
{
public:
virtual void Fun1(){};
};
class CChild : public CBase
{
private:
virtual void Fun1(){};
}
CBase* pChild = new Child();
pChild->Fun1(); //正常可以访问
3. 派生类需要显式调用基类函数时,必须将调用写在构造函数参数列表中。写在参数体内会额外进行一次默认构造函数调用。
class CBase
{
public:
CBase(int nNum){};
CBase(){};
};
class CChild: public
{
public:
CChild(int nNum)
{
CBase(nNum); //错误调用,会调用两次基类构造函数,第一次是CBase()
}
//正确调用
CChild(int nNum):CBase(nNum)
{
};
};