C++继承
2015-07-04 10:10
232 查看
首先,子类只能继承父类的public和protected成员。
公有继承:基类的公有成员和保护成员作为派生类的公有成员和保护成员。
私有继承:基类的公有成员和保护成员都作为派生类的私有成员。
保护继承:基类的公有成员和保护成员都作为派生类的保护成员。
*在子类中,父类的私有成员可以通过父类的public函数获得(只要这个父类的public函数在子类中没有被重写)
虚继承。(virtual只用于两个地方:一个是虚函数,另一个就是虚继承)
虚继承的关键字virtual高速编译器不事先绑定,在运行时才能进行定位访问。
编译器对每个包含虚函数的类创建一个表(vtable),设置一个指针(vfptr)指向它。所以A的大小为char k[3]对齐后的4字节+vfptr的4字节,为8
B虚继承了A,那么B中有一个虚类指针(vbptr_B_A)来指向其父类,然后还要包含父类的所有内容。所以B的大小是j[3]对齐后的4字节+指向B的vtable的虚指针vfptr的4字节+A的大小(8字节),为16。
虚继承运用于多重继承,如:B,C都继承A,D继承自B和C,那么普通继承就是:
A A
\ /
B C
\ /
D
在类D中A重复出现,浪费内存空间,运用虚拟继承后:
A
/ \
B C
\ /
D
公有继承:基类的公有成员和保护成员作为派生类的公有成员和保护成员。
私有继承:基类的公有成员和保护成员都作为派生类的私有成员。
保护继承:基类的公有成员和保护成员都作为派生类的保护成员。
*在子类中,父类的私有成员可以通过父类的public函数获得(只要这个父类的public函数在子类中没有被重写)
虚继承。(virtual只用于两个地方:一个是虚函数,另一个就是虚继承)
class A{ char k[3]; public: virtual void aa(){}; }; class B: public virtual A{ char j[3]; public: virtual void bb(){}; };
虚继承的关键字virtual高速编译器不事先绑定,在运行时才能进行定位访问。
编译器对每个包含虚函数的类创建一个表(vtable),设置一个指针(vfptr)指向它。所以A的大小为char k[3]对齐后的4字节+vfptr的4字节,为8
B虚继承了A,那么B中有一个虚类指针(vbptr_B_A)来指向其父类,然后还要包含父类的所有内容。所以B的大小是j[3]对齐后的4字节+指向B的vtable的虚指针vfptr的4字节+A的大小(8字节),为16。
虚继承运用于多重继承,如:B,C都继承A,D继承自B和C,那么普通继承就是:
A A
\ /
B C
\ /
D
在类D中A重复出现,浪费内存空间,运用虚拟继承后:
A
/ \
B C
\ /
D
相关文章推荐
- 【c语言】判断一个字符串是否为另外一个字符串旋转之后的字符串
- 【c语言】字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形
- C++ Builder XE7 调用JAVA的JAR文件
- 【C语言】编写函数实现字符串旋转
- [C语言】模拟实现库函数strstr,查找子字符串
- 【C语言】判断一个字符串是否是一个字符串的旋转字符串
- 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”
- 单循环链表的约瑟夫问题(C++)
- C++可变参数
- C语言 基础60题(3)
- C语言文件操作函数大全
- c++异常处理,,,同时处理除数为0以及开根号内部不能小于0
- 【C++ Primer Plus学习笔记】第二章:一个函数的基本的组成
- 什么时候用C而不用C++?
- C++可调用对象适配器和绑定器
- 双向链表的C++实现
- 【学习笔记】【C语言】文件的包含
- 漂亮的C++控制台界面(格式化输入输出)
- 黑马程序员---C语言基础---函数、参数、返回值