您的位置:首页 > 编程语言 > C语言/C++

C++继承与多态注意点汇总

2013-09-29 09:12 246 查看
三种继承方式:

(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)
{
};
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: