多继承

C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承,此时派生类有两个或两个以上的直接基类。

虚基类与二义性

菱形继承可能会存在二义性
多继承

int main( )
{
    DC d;
    d.x = 1;       // error C2385: 对"x"的访问不明确
         //可能是"x"(位于基"BC1"中),也可能是"x"(位于基"BC2"中)
    d.BC1::x = 2;   // OK,from BC1
    d.BC2::x = 3;   // OK,from BC2
    d.K = 4;           // error C2385: 对"K"的访问不明确
    d.BC1::K = 5;  // OK,from BC1
    d.BC2::K = 6;  // OK,from BC2
    return 0;
}

解决方法:采用虚继承,在BC1类和BC2类继承BC0时,其前面加上virtual关键字就可以实现虚拟继承,使用虚拟继承后,当系统碰到多重继承的时候就会先自动加一个BC0的拷贝,当再次请求一个BC0的拷贝时就会被忽略,以保证继承类成员函数的唯一性。

class BC0
{
public:
    int K;
};
class BC1 : virtual public BC0
{
public:
    int x;
};
class BC2 : virtual public BC0
{
public:
    int x;
};
class DC : public BC1, public BC2
{
};
void main( )
{
    DC d;       //虚继承使得BC0仅被DC间接继承一份
    d.K = 13;    // OK
}

多继承下的构造函数

#include<iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        cout<<"B1"<<endl;
    }
};
class B2
{
public:
    B2(int i)
    {
        cout<<"B2"<<endl;
    }
};
class B3
{
public:
    B3(int i)
    {
        cout<<"B3"<<endl;
    }
};
class B4
{
public:
    B4(int i)
    {
        cout<<"B4"<<endl;
    }
};
class D : public B2, virtual B1, public B4, virtual B3
{
public:
    D(int n): B1(n), B2(n), B3(n), B4(n) {}
};
int main( )
{
    D d(1);
    return 0;
}

执行结果:

B1
B3
B2
B4

在同一层次中,先调用虚基类的构造函数,接下来依次是非虚基类的构造函数,然后是派生类的构造函数。
若同一层次中包含多个虚基类,这些虚基类的构造函数按对它们声明的先后次序调用;非虚基类也是按照它们的声明先后次序调用

参考
https://www.cnblogs.com/wkfvawl/p/10756539.html

原文链接: https://www.cnblogs.com/hunter-w/p/13260417.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    多继承

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/363426

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午2:57
下一篇 2023年3月2日 下午2:57

相关推荐