简介:继承分为单继承与多继承。多继承又分为多级继承与多重继承,同时又演化出了 多级多重继承。因此在多级多重继承上,衍生出了虚基类的问题。(假设现在有五个类,分别为A,B,C,D,E)
- 多级继承:A是基类,B继承A,C继承B,D继承C,E继承D.这种继承方式就是多级继承。
- 多重继承:A是基类,B继承A,C继承A,D继承B,C,E继承D.这种继承方式既可以是多重继承,也可以是多级多重继承。
在继承关系中,如果类中有同名成员(temp),如何去访问?
通过对象自己访问的是这个对象自己的成员。
如果去访问基类的同名成员,可以通过类名限定::去访问。========》以下代码针对派生类对象如何去访问基类中的同名成员。由此引发的一个问题?从而引出虚基类的概念。
代码学习:(代码中有注释,多去理解)
//多级多重继承引出虚基类的问题?什么是虚基类,虚基类能做什么。 //多级多重继承: //会导致在派生类中可能会有多个相同的基类,因此会影响派生类的大小。所以这个就是一个问题,为了解决这个问题,虚基类就出现了。也就是在相关类前加关键字virtual. //有两种用法:一些特殊的情况,必须有多个相同的基类(一般这种情况比较少) //通常情况下,不需要多个相同的基类(因此引出虚基类的概念) //---------------------------------------------- // #include<iostream> using namespace std; class CA{ public: int temp; public: CA(){ } ~CA(){} }; class CB:public CA{ public: int temp; public: CB(){ } ~CB(){} }; class CC :public CA{ public: int temp; public: CC(){ } ~CC(){} }; class CD :public CB, public CC{ public: int temp; public: CD(){ } ~CD(){} }; class CE :public CD{ public: int temp; public: CE(){ } ~CE(){} }; int main(){ //为了方便看到效果,把类中成员temp的访问属性统一为public. //在继承关系中,如果类中有同名成员(temp), 如何去访问? //通过对象自己访问的是这个对象自己的成员。 // 如果去访问基类的同名成员,可以通过类名限定:去访问。 CE e;//以最终派生类E去访问不同类中的同名成员temp; e.temp = 12; e.CD::temp = 13; e.CD::CB::temp = 14; e.CD::CC::temp = 14; //e.CD::CC::CA::temp = 15;//以最终派生类去访问基类中的同名成员temp //e.CD::CC::CB::temp = 15;//出现调用不明确 //因此引出了虚基类,来解决这个问题 }