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();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Python补充11 序列的方法 正则表达式 (re包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

851
来自专栏浪淘沙

java初级笔记----final、static、匿名对象、内部类

一、final 1、final可以用来修饰类,方法,成员变量, 2、final修饰类不可以被继承,但是可以继承其他类。 3、final修饰的方法不可...

1773
来自专栏GreenLeaves

JS框架设计之对象数组化一种子模块

类数组对象是一个很好的存储结构,但是功能太弱了,为了享受纯数组的哪些便捷的方法,使用前可以做下转换,通常可以使用$.slice.call()方法做转换,但是旧版...

2055
来自专栏软件开发

JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

一、闭包(Closure) 1.1、闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,...

2225
来自专栏mwangblog

python变量、语句

1654
来自专栏coder修行路

go 从入门到精通(二)基本数据类型和操作符

一、文件名&关键字&标识符 所有go源码都是以.go结尾 标识符以字母或下划线开头,大小写敏感 下划线_是特殊标识符,用户忽略结果 保留关键字 导入包时可以设置...

1959
来自专栏Android 研究

Retrofit解析3之反射

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在计算机科学领域,反射是一类应用,它们能够自描述和自控制。这类应用通过某种机制来实现对自己行为的...

1682
来自专栏cs

c++面向对象的一些问题1.0

构造函数 特殊的成员函数,给对象的初始化,不需要用户调用,建立对象时,自动执行 它的函数名字与类相同,可以重载,没有返回值和函数类型。 如果不写构造函...

30510
来自专栏Spring相关

带返回值的函数,闭包,沙箱,递归详解

那了解了函数 this 指向的不同场景之后,我们知道有些情况下我们为了使用某种特定环境的 this 引用, 这时候时候我们就需要采用一些特殊手段来处理了,例如...

582
来自专栏MasiMaro 的技术博文

结构体和类

在C++中类与结构体并没有太大的区别,只是默认的成员访问权限不同,类默认权限为私有,而结构体为公有,所以在这将它们统一处理,在例子中采用类的方式。

2182

扫码关注云+社区

领取腾讯云代金券