您的位置:首页 > 编程语言 > C语言/C++

C++的三大特性——继承

2017-07-26 12:53 323 查看

1、三种继承方式

1、public 共有继承,继承下的成员,与基类成员权限相同

2、protected 保护继承 派生类可以访问,不能在类外访问,权限缩小

3、private 私有继承 派生类不能访问基类

ps: class的默认继承权限为private,struct的默认继承权限为public;


2、继承的多种模型

单继承:一对一的继承

多继承:一个派生类继承了多个父类

菱形继承

虚拟继承

虚拟菱形继承

1、单继承

单继承很简单,所以我们在这里说明两个在继承中存在的问题;

1、同名隐藏:当基类和派生类的成员名称相同(函数名只要相同,与函数参数,返回值无关),在访问成员时系统默认访问派生类的成员。若要访问基类则需要加上访问作用域。

2、赋值兼容问题:派生类的对象可以直接赋值给基类(切断),调用的是基类的赋值重载

父类的指针/引用,可以指向子类的对象

//同名隐藏
class Base
{
public:
int _b1;
int _count;
};
class Derived:public Base
{
public:
int _d;
int _count;
};
int main()
{
D d;
B b;
b = d; //派生类对象直接赋值给基类;
d = b;//error,不可以,会访问空间出错
B& b1 = d; //基类引用指向子类
d._count = 0;//同名隐藏,默认访问Derived::_count;
d.Base::_count = 0;//加上Base域,则访问的是继承下来的Base::_count
return 0;
}


2、多继承

1.继承代码:

class B1
ae2a
{
public:
int _b1;
int _c1;
};
class B2
{
public:
int _b2;
int _c2;
};

class D:public B1,public B2
{
public:
int _d1;
int _d2;
};


2.继承模型



3、菱形继承

继承模型:



菱形继承存在的问题

我们明显的看出B::_b,在D中存放了两次,产生了数据冗余;在我们访问_b的时候也会产生二义性问题,所以为了解决这个问题出现了虚拟继承

4、虚拟继承

虚拟继承:是在继承类的前面加上:virtual关键子

继承模型:



虚拟继承,增加了4个字节,用来存放偏移量表的指针,偏移量表用来存放自己的相对偏移量,和继承类相对的偏移量。

5、菱形虚拟继承

继承模型:



从图中我们可以看出两个中间类的偏移量表都指向了同一个B类,解决了菱形继承的二义性问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class 继承