多重继承

来源:互联网 发布:曹雪松淘宝技术总监 编辑:程序博客网 时间:2024/04/29 15:34

继承方式
公有继承--派生类的子类和派生类对基类的成员具有一样的访问权限
私有继承--基类的公有成员和保护成员,变成派生类的私有成员
保护继承--基类的公有成员和保护成员,变成派生类的保护成员
    三种继承方式中的基类的私有成员在派生类中权限不变。

    派生类的构造函数中,需要初始化基类和成员对象,即赋初值。 但是对于使用无参构造函数(这里的无

参函数包括默认构造函数)可以不列出基类名和对象成员名。  无参的构造函数会对对象的除了在构造函数

设置了值的其他成员初始化为零或空...

多重继承: class A; class B1:A; class B2:A;  class C:B1,B2;
对于<>型(像下面的)交叉多重继承,既在多条继承路径上有一个公共的基类,则在这条路径的汇合点上便会

产生来自不同路径的公共基类的多个拷贝。如上:派生类B1/B2多从基类A继承,这是派生类会有2个基类A的

赋值,则会产生二义性。解决二义性的方法可以使用运算符:: 来消除和使用虚基类。

虚基类的使用
   要注意的是虚基类的构造函数的调用方法和一般的基类的构造函数调用方法是不同的。c++规定,由虚

基类经过一次或多次派生出来的派生类,在其每一个派生类的构造函数的成员初始化列表中必须给出对虚

基类的构造函数的调用,如果未给出,则调用虚基类的默认构造函数。在这种情况下,虚基类必须具有默

认的构造函数(在什么情况下没有默认的构造函数:在类声明的带参数的构造函数)。在下面程序用。类C的

构造函数尽管分别调用了其基类B1/B2的构造函数,但是由于虚基类A在类C中只有一个复制,所以编译器无

法确定应该由类B1还是B2的构造函数来调用基类A的构造函数.在这种情况下,c++规定,在执行B1/B2的构

造函数时多不调用虚基类A的构造函数,而是在类C的构造函数中直接调用虚基类A的默认构造函数。所以运

行结果中X为何=0。

 

#include<iostream.h>class A{public: int x; A(int a=0){x=a;}; //也可以这样写 A(int a)(x=a;);A():x(100){}//但不能A(int a)(x=a);};class B1:virtual public A  //声明虚继承{public:  int y1;  A test;   //声明对象成员  B1(int a=0,int b=0):A(b),test(10)  //基类成员和对象成员设置初值   {  y1=a; }  void print(void)  {      cout<<"B1:X="<<x<<",y1="<<y1<<endl;      cout<<"test:X="<<test.x<<endl;  } };class B2:virtual public A{public:  int y2;  B2(int a=0,int b=0):A(b)   {  y2=a; }  void print(void)  {    cout<<"B2:x="<<x<<",y2="<<y2<<endl;  } };class C:public B1,public B2{public: int z; C(int a,int b,int d,int e,int m):B1(a,b),B2(d,e)    {z=m;} void print() {  B1::print();  B2::print();  cout<<"z="<<z<<endl; }};void  main(){   C c1(100,200,300,400,500);   c1.print();   c1.x=400;   c1.print();}