c++多重继承小结

简介:

如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。

即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法

 

如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径分别继承非虚基类的一个实例。多个基类

都是有问题的。使用虚基类的MI,当派生类使用关键字virtual来指示派生时,基类就成为虚基类:

class A:public virtual B

{}

主要变化是,从虚基类的一个或多个实例派生而来的类将只继承了一个基类。对实现这种特性,必须满足其他要求:

1》有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的;

2》通过优先规则解决名称二义性。

MI会增加编程的复杂程度,然而这种复杂性主要是由于派生类通过多条途径继承同一个基类引起的。避免这种情况后

唯一需要注意的是必要时对继承的名称进行限定

 

复制代码
#include<iostream>
using namespace std;
class A
{
    int a;
public:
    A(int n=0):a(n)
    {
        cout<<"A"<<endl<<" int a="<<a<<endl;
    };
};


class B:public virtual A
{
    int b;
public:
    B(const A & a,int m=0,int n=0):A(n),b(m)
    {
        cout<<"B"<<endl<<" int b="<<b<<endl;
    };
};

class D:public virtual A
{
    int d;
public:
    D(const A & a,int m=0,int n=0):A(n),d(m)
    {
        cout<<"D"<<endl<<" int d="<<d<<endl;
    };
};


class C :public B,public D
{
    int c;
public :
    
    /*C(const A & a ,int q=0,int m=0,int n=0):B(a,m,n),D(a,m,n),c(q)
    {
        cout<<"C"<<endl<<" int c="<<c<<endl;
    };*/
    //上边将通过两种不同的途径把a传递给A这会有二义性
    //c++在使用虚基类时禁止信息通过中间类自动传递给基类
    //因此上面的构造函数将初始化B类的bw但和D类的d,a不会传递给子对象b也不会传递给D对象
    //会调用A的默认无参构造函数
    //所以必须在构造派生对象之前构造基类对象组件,如果不希望默认构造函数来构造虚对象,则需要显式地调用
    //所需基类构造函数因此应该这样
    C(const A & a ,int q=0,int m=0,int n=0):A(a),B(a,m,n),D(a,m,n),c(q)
    {
        cout<<"C"<<endl<<" int c="<<c<<endl;
    };
    //上述代码将显示的调用A(const A &)这样做是合法的,对于虚类必须这样做,对于非虚基类,则是非法的。
    //如果类有间接虚基类,除非只需使用该虚基类的默认构造函数,否则必须显式地调用该虚基类的某个构造函数
};

int main()
{

    A * a=new  A(1);
    //D(a,1,2);
    C c(*a,1,2,3);
    cin.get();
}
复制代码

 本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/p/3508246.html,如需转载请自行联系原作者

相关文章
|
12天前
|
C++
[C++/PTA] 日程安排(多重继承+重载)
[C++/PTA] 日程安排(多重继承+重载)
48 0
|
7月前
|
Java 编译器 PHP
C++的多重继承
派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C{ //类D新增加的成员 } D 是多继承形式的派生类,它以公有的方式继承 A 类,
53 0
|
11月前
|
编译器 C++
C++中的多重继承
🐰多重继承 🌸声明多重继承的方法 🌸多重继承派生类的构造函数与析构函数 🌸多重继承引起的二义性
|
12月前
|
Java 编译器 Android开发
Android C++系列:C++最佳实践4多重继承与虚继承
Java和C++在语法层面比较的时候就不得不提到C++的多继承,我们知道Android是单继承,C++是多继承。在大型项目中不可避免的会用到多继承,本文分析C++多继承的一些特征。
84 0
|
Java C++
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
159 0
C/C++---Person类、学生类、教师类和研究生类(多重继承)
C/C++---Person类、学生类、教师类和研究生类(多重继承)
740 0
|
C++ 人工智能 开发工具
《C++语言基础》程序阅读——多重继承
返回:贺老师课程教学链接 (1)阅读程序,写出执行结果#include &lt;iostream&gt; using namespace std; class A { public: A() { a=0; } A (int i) { a=i; } void print() { co
1023 0