菱形继承

1.继承
(1)定义:继承是面向对象复用的重要手段,通过继承定义一个类,继承是类型之间的关系模型,共享共有的东西 ,实现各自本质不同东西。

class Person      //父类/基类                          
{
public:
       void Display()
       {
       cout<<_name<<endl;
       }
 protected:
       string_name;
};

class Student:public Person
//子类/派生类 //继承关系
{
       protected:
       int_num;
};
void Test()
{
   Person p;
   Student s;
}

(2)三种继承关系:public(公有继承),protect(保护继承),private(私有继承)
三种继承关系下基类成员在派生类下的访问变化关系:
这里写图片描述
2.继承与转换
(1)子类对象可以赋值给父类对象,(如上面代码:p=s)
(2)父类对象的指针和引用可以指向子类对象,(Person*p1=&s,Person&r1=s)
3.单继承&多继承&菱形继承
(1)单继承:一个子类只有一个直接父类的继承关系。
这里写图片描述
(2)多继承:一个子类有两个或多个直接父类的继承关系。
这里写图片描述
(3)菱形继承:两个子类继承同一个父类,同时又有两个子类又分别继承这两个子类。
这里写图片描述
3.菱形继承存在的问题:
1)二义性 :即在Assistant类中存在两个name对象,
2)数据冗余:即在Assistant类中Student类和Teachar类中存在两个同名对象name相等的情况,

这里写图片描述
4.虚继承:为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。—–解决了二义性和数据冗余的问题,并且带来了性能上的损耗。
这里写图片描述

class A
{
public:
    int _a;
};

class B : virtual public A
{
public:
    int _b;
};

class C: virtual public A
{
public:
    int _c;
};

class D: public B, public C
{
public:
    int _d;
};

int main()
{
    D d;
    d.B::_a = 0;
    d.C::_a = 1;
    d._b = 2;
    d._c = 3;
    d._d = 4;

    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值