C++ 类(多继承和虚继承)

文章概述

  1. 多继承的定义以及多继承的语法;
  2. 虚继承;

多继承的定义以及多继承的语法

a. 一个类有多个基类,这样的继承关系称为多继承;
b. 多继承声明语法:

class 派生类名: 访问控制符 基类名1,访问控制符 基类名2
{
数据成员和成员函数声明;
}

class A: public B,public c
{
}

图示:
这里写图片描述
c. 多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。


虚继承

  1. 产生二义性 ?
class A
{
public:
    int x;
};

class B: public A
{
    int b;
public:
    B(int x)
    {
        this->x = 10;
    }
};

class C : public A
{
    int c;
public:
    C(int x)
    {
        this->x = 20;
    }
};

class D :public B,public C
{
    int d;
public:
    D(int x):B(10),C(20)
    {
        //对于D中的x,到底是从哪个类(B,C)中继承的,不明确,会产生二义性。
        this->x = 30;
    }
};

对于产生二义性的原因分析在于分析d的对象模型:
这里写图片描述
其实,产生二义性的原因就在于A的构造函数在c中调用了两次,不知道x是哪个对象的。如果要让A在c中只产生一个对象,则应该对公共基类A声明为虚继承,使得这个公共基类成为虚基类。
2. 在c中只产生一个公共基类的对象

//当类中出现virtual时,C++编译器会对象添加一个vptr指针,同时会产生一个虚函数表
class A
{
public:
    int x;  //4
public:
    A()
    {
        cout << "A" << endl;
    }
};

class B:virtual  public A
{
    int b; //4
public:
    B(int x)
    {
        this->x = 10;
        cout << "B" << endl;
    }
};

class C :virtual public A
{
    int c; //4
public:
    C(int x)
    {
        this->x = 20;
        cout << "C" << endl;
    }
};

class D :public B,public C
{
    int d; //4 
public:
    D(int x):B(10),C(20)
    {
        this->x = 30;
        cout << "D" << endl;
    }
};

int main()
{
    cout << sizeof(A) << endl;   //4
    cout << sizeof(B) << endl;   //12
    cout << sizeof(C) << endl;   //12
    cout << sizeof(D) << endl;   //24
    return 0;
}

分析d的对象模型:
这里写图片描述
C++提供虚继承机制,防止类继承关系中成员访问的二义性。

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值