C++ 学习(虚基类)
2015-11-22 15:37
507 查看
#include <iostream> //基类 using namespace std; class CBase { protected: int a; public: CBase(int na) { a=na; cout<<"CBase constructor! "<<endl; } ~CBase(){cout<<"CBase deconstructor! "<<endl;} }; //派生类1(声明CBase为虚基类) class CDerive1:virtual public CBase { public: CDerive1(int na):CBase(na) { cout<<"CDerive1 constructor! "<<endl; } ~CDerive1(){cout<<"CDerive1 deconstructor! "<<endl;} int GetA(){return a;} }; //派生类2(声明CBase为虚基类) class CDerive2:virtual public CBase { public: CDerive2(int na):CBase(na) { cout<<"CDerive2 constructor! "<<endl; } ~CDerive2(){cout<<"CDerive2 deconstructor! "<<endl;} int GetA(){return a;} }; //子派生类 class CDerive12:public CDerive1,public CDerive2 { public: CDerive12(int na1,int na2,int na3):CDerive1(na1),CDerive2(na2),CBase(na3) { cout<<"CDerive12 constructor! "<<endl; } ~CDerive12(){cout<<"CDerive12 deconstructor! "<<endl;} }; int main() { CDerive12 obj(100,200,300); //得到从CDerive1继承的值 cout<<" from CDerive1 : a = "<<obj.CDerive1::GetA(); //得到从CDerive2继承的值 cout<<" from CDerive2 : a = "<<obj.CDerive2::GetA()<<endl<<endl; return 0; }
参考: http://blog.chinaunix.net/uid-26983585-id-3309645.html
http://blog.csdn.net/livelylittlefish/article/details/2171267
http://blog.sina.com.cn/s/blog_4a286b4e010125rk.html
c++ 引入虚基类的原因是多继承产生了二义性。
虚基类的特点:
虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承);
虚基类的构造函数先于非虚基类的构造函数执行
在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间。
虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。
相关文章推荐
- 在C++中使用golang的协程
- c++虚函数逆向分析
- 在C++中使用golang的协程
- C语言学习web服务器小实例
- hiho 12 树的dp
- C语言素数的多种求法
- c语言内存模型
- c语言学习第一天
- C++IO流简介
- C++IO流简介
- C++指针和引用的区别
- 【C++】中序线索化二叉树及其遍历
- C++ Runtime Error :STL list "list iterator not incrementable"
- 学生成绩管理系统课程设计(C语言,链表实现)
- C++构造与析构函数中调用虚函数的问题
- 2014传智播客C++第三期基础班+就业班至9月份 完整版
- ICL Auto Vectorization
- 011--VS2013 C++ 斜角地图贴图
- C++实现String类
- c语言:编辑程序输出取数组地址