实例解释C++虚继承、菱形继承

part1:

#include<iostream>
#include<string>
using namespace std;
// 祖先类
class R{
    public:
    R():r("default"){
        cout<<"calling R()"<<endl;
    }
    R(string str):r(str){
        cout<<"calling R("<<str<<")"<<endl;
    }
    void print()const{cout<<"r="<<r<<endl;}
    private:
    string r;
};
// 父类A
class A:virtual public R{
    public:
    A(string str):R(str){
        cout<<"calling A("<<str<<")"<<endl;
    }
};
//父类B
class B:virtual public R{
    public:
    B(string str):R(str){
        cout<<"calling B("<<str<<")"<<endl;
    }
};

part2:


class C:public A,public B{  // 继承体系的拓扑结构:R,A,B,如果这里调换A与B的顺序则变成R,B,A
    public:
    C(string str1,string str2,string str3):A(str1),B(str2)/*,R(str3)*/{}
    /*
    派生关系:R->A,R->B,A,B->C
    1、在派生类C的构造函数中通过间接基类A、B的构造函数初始化菱形基类R数据成员是不得行的,
    尽管间接基类A与B的构造函数A(str1)和B(str2)均在各自的初始化列表中调用了
    菱形基类R的构造函数R(str),但在这里虽然执行了A(str1)和B(str2)但均未调用各自
    的初始化列表中的R(str)部分,
    2、而是按照继承体系的拓扑结构R,A,B顺序分别调用了
    R(str3),A(str1)排除R(str),B(str2)排除R(str),
    输出:
    calling R(str3)
    calling A(str1)
    calling B(str2)
    r=str3
    2、如果这里不主动初始化菱形基类R则跟常规继承一样调用基类R的默认构造,将
    按照继承体系的拓扑结构R,A,B顺序分别调用
    R(),A(str1)排除R(str),B(str2)排除R(str),
    输出:
    calling R()
    calling A(str1)
    calling B(str2)
    r=default
    */
};
int main(int argc,char * argv[]){
    C obj("str1","str2","str3");
    obj.print();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值