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类,解决了菱形继承的二义性问题。
相关文章推荐
- C++三大特性:封装、继承、多态
- C++的三大特性:封装、继承、多态
- C++三大特性之多态(二)---深度剖析各种虚继承虚函数以及虚表的内容存放
- C++三大特性之继承简述
- 继承----C++的三大特性之一
- C++基础之三大特性之继承的本质(要当就当富二代,否则自己动手才能丰衣足食)
- c++三大特性之 继承
- C++三大特性之继承
- C++三大特性 -- 继承
- C++的三大特性之一继承
- 【C++】浅谈三大特性之一继承(一)
- 【C++】浅谈三大特性之一继承(三)
- C++三大特性之一继承
- c++三大特性之继承
- C++三大特性之继承
- 继承----C++的三大特性之一
- 继承 -----C++三大特性之一
- 【C++】浅谈三大特性之一继承(二)
- C++的三大特性:封装、继承和多态性的详解
- C++的三大特性:封装、继承、多态,以及多态的具体实现