C++菱形继承+虚继承

单继承和多继承
单继承:一个派生类只有一个直接基类。
(B的直接父类只有A,是单继承)

class AA
{
public:
    AA(int a=1)
    :_a(a)
    {
        cout << "AA()" << endl;
    }

    int _a;
};

class BB : public AA
{
public:
    BB(int b=2)
    :_b(b)
    {
        cout << "BB()" << endl;
    }

    int _b;
};

多继承:一个派生类的直接基类至少有两个。
(C类不仅继承了A类,还继承了B类,是多继承)

class CC : public AA ,public BB
{
public:
    CC(int c=3)
    :_c(c)
    {
        cout << "CC()" << endl;
    }

    int _c;
};

菱形继承属于多继承。

#include<iostream>
#include<stdlib.h>
using namespace std;

class A
{
public:
    A(int a=1)
    :_a(a)
    {
        cout << "A()" << endl;
    }

    int _a;
};

class B : public A
{
public:
    B(int b=2)
    :_b(b)
    {
        cout << "B()" << endl;
    }

    int _b;
};

class C : public A 
{
public:
    C(int c=3)
    :_c(c)
    {
        cout << "C()" << endl;
    }

    int _c;
};

class D : public B, public C
{
public:
    D(int d=4)
    :_d(d)
    {
        cout << "D()" << endl;
    }

    int _d;
};

int main()
{
    D d;
    d._a;
}

对上面代码进行编译,发现不通过,错误如下:

这里写图片描述

这个是菱形继承存在的二义性的问题。

这里写图片描述
从图中可以看出来,在D类中B类和C类分别存了一份A类的成员变量,造成了数据冗余的问题。

二义性问题可以通过指定类域进行访问,但是这样太麻烦,而且数据冗余的问题并没有得到解决。针对这个问题C++引入了虚继承。

虚继承:继承的前面加上virtual.
形如:class 派生类名:virtual 继承方式 基类名
(virtual为关键字,声明该基类为派生类的虚基类)

这里写图片描述

#include<iostream>
#include<stdlib.h>
using namespace std;

class A
{
public:
    A(int a=1)
        :_a(a)
    {
        cout << "A()" << endl;
    }

    int _a;
};

class B : virtual public A
{
public:
    B(int b=2)
        :_b(b)
    {
        cout << "B()" << endl;
    }

    int _b;
};

class C : virtual public A 
{
public:
    C(int c=3)
        :_c(c)
    {
        cout << "C()" << endl;
    }

    int _c;
};

class D : public B, public C
{
public:
    D(int d=4)
        :_d(d)
    {
        cout << "D()" << endl;
    }

    int _d;
};

int main()
{
    D d;
}

这里写图片描述
虚继承的内存分布有所变化,这里将公共的A类成员变量单独存起来,以前存A类成员变量的地方存了虚基类的地址,这个地址存的是A类成员变量距派生类地址的偏移量。

虽然虚继承解决了菱形继承二义性和数据冗余的问题,但是性能上会有所影响。

没有使用虚继承时,sizeof(d)=20;
使用虚继承后,sizeof(d)=24.

如果您忘记了 Mobaxterm 的主密码,这可能会导致您无法访问由密码保护的文件和目录,或者在使用其他功能时遇到问题。以下是您可以尝试的一些方法。 1. 重新安装 Mobaxterm:如果您忘记了主密码,并且没有重要的数据需要保留,最简单的方法可能是卸载 Mobaxterm 并重新安装。这将重置所有设置,包括密码。 2. 重置主密码:如果您不想重新安装 Mobaxterm,并且您有管理员权限,您可以尝试使用以下步骤重置主密码。 a. 在 Mobaxterm 中单击 "Settings"(设置) > "Master password"(主密码)。 b. 在主密码窗口中,单击 "Reset"(重置)。 c. 您将被要求输入您的 Windows 登录密码,然后单击 "OK"(确定)。 d. Mobaxterm 将提示您输入新的主密码。 请注意,这将重置所有使用主密码保护的文件和目录。请确保备份所有重要的数据。 3. 使用备份文件:如果您已创建了 Mobaxterm 的备份文件(.mobaxterm),您可以使用该文件来恢复主密码。 a. 在 Mobaxterm 中单击 "Settings" > "Configuration settings"(配置设置)。 b. 单击 "Backup and restore"(备份和恢复)。 c. 单击 "Restore settings"(恢复设置)并选择您的备份文件。 d. 在恢复设置向导的 "Security"(安全)选项卡中,单击 "Change master password"(更改主密码)。 e. 输入新的主密码并单击 "OK"。 请注意,这将使用备份文件恢复所有设置,包括主密码。这也将覆盖您的当前设置。 总之,如果您忘记了 Mobaxterm 的主密码,您可以尝试重新安装它,重置密码或使用备份文件来恢复密码。请记住,在执行任何操作之前,请备份所有重要数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值