C++虚继承
2015-05-15 16:46
169 查看
C++虚继承概念:
Virtual Inheritance 虚继承,解决从不同途径继承来的同名数据成员在内存中不同的数据拷贝导致的数据不一致问题,将共同的基类设置为虚基类。这时从不同路径继承来的数据成员在内存中只有一份拷贝,同名函数也只有一个映射。
语法:
Class C:virtual public A,virtual public B,…,virtual public n
{
}
执行顺序
1.执行虚基类的构造函数,多继承按照继承顺序构造
2.执行基类的构造函数,多继承按照继承顺序构造
3.执行成员对象的构造函数,多个成员对象按照申明顺序构造
4.执行派生类自己的构造函数
备注:执行析构的顺序与以上顺序相反
在执行虚基类构造函数的时候,如果是多重继承
虚继承与普通继承的区别
普通继承: C继承A 表明C “is a”即苹果就是水果
虚继承: C虚继承A 表明C “has a”即苹果是水果,但是苹果也可以是手机,C有了一个调用A的vptr
普通继承:
虚继承:
看一下,调用方式及输出结果都有了变化^_^,细心的观众是不是发现虚继承的方法比普通继承的方法输出少了一次“This is A Method”
好了,希望能对您有所帮助。
Virtual Inheritance 虚继承,解决从不同途径继承来的同名数据成员在内存中不同的数据拷贝导致的数据不一致问题,将共同的基类设置为虚基类。这时从不同路径继承来的数据成员在内存中只有一份拷贝,同名函数也只有一个映射。
语法:
Class C:virtual public A,virtual public B,…,virtual public n
{
}
执行顺序
1.执行虚基类的构造函数,多继承按照继承顺序构造
2.执行基类的构造函数,多继承按照继承顺序构造
3.执行成员对象的构造函数,多个成员对象按照申明顺序构造
4.执行派生类自己的构造函数
备注:执行析构的顺序与以上顺序相反
在执行虚基类构造函数的时候,如果是多重继承
虚继承与普通继承的区别
普通继承: C继承A 表明C “is a”即苹果就是水果
虚继承: C虚继承A 表明C “has a”即苹果是水果,但是苹果也可以是手机,C有了一个调用A的vptr
普通继承:
// Virtual_Exercise.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" class A { public: A(); void print() { printf("This A class Aprintf\n"); } ~A(); private: }; A::A() { printf("This is A Method\n"); } A::~A() { printf("This is A Destructor\n"); } class B: public A { public: B(); ~B(); void A(); void print() { printf("This B class Aprintf\n"); } private: }; void B::A() { printf("this is B's A Method\n"); } B::B() { printf("this is B Method\n"); } B::~B() { printf("This is B Destructor\n"); } class C:public A,public B { public: C(); ~C(); private: }; C::C() { printf("this is C Method\n"); } C::~C() { printf("this is C Destructor\n"); } int _tmain(int argc, _TCHAR* argv[]) { A a; a.print(); B b; b.A(); b.print(); C c; //c.print();这种调用方法会出现错误 c.B::print(); c.A::print(); getchar(); return 0; }
虚继承:
// Virtual_Exercise.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" class A { public: A(); void print() { printf("This A class Aprintf\n"); } ~A(); private: }; A::A() { printf("This is A Method\n"); } A::~A() { printf("This is A Destructor\n"); } class B: virtual public A { public: B(); ~B(); void A(); void print() { printf("This B class Aprintf\n"); } private: }; void B::A() { printf("this is B's A Method\n"); } B::B() { printf("this is B Method\n"); } B::~B() { printf("This is B Destructor\n"); } class C: virtual public A,virtual public B { public: C(); ~C(); private: }; C::C() { printf("this is C Method\n"); } C::~C() { printf("this is C Destructor\n"); } int _tmain(int argc, _TCHAR* argv[]) { A a; a.print(); B b; b.A(); b.print(); C c; c.print();//这样就可以调用了 //c.B::print(); //c.A::print(); getchar(); return 0; }
看一下,调用方式及输出结果都有了变化^_^,细心的观众是不是发现虚继承的方法比普通继承的方法输出少了一次“This is A Method”
好了,希望能对您有所帮助。
相关文章推荐
- 不能被继承的类[C/C++/C#]
- C++继承:公有,私有,保护
- C++单继承
- c++ 三种继承(public protect private)
- 继承与派生编程题1(C++程序设计第5周)
- C++中的虚拟继承(二)【转】
- c++中子类的继承和调用父类构造函数的方法——学习c++笔记
- C++继承
- C++ 各种继承
- C++中的继承(3)作用域与重定义,赋值兼容规则
- C++中虚拟继承问题
- C++多态之继承5-继承和访问说明符(public ,protected, private)
- c++ 虚继承与继承的差异
- C++之继承和动态内存分配
- C++中的三种继承public,protected,private详细解析
- C++学习笔记——继承与派生(二)
- C++ (public, protected, private继承)
- C++多态之继承6-派生类中增加功能,重定义功能,添加功能以及隐藏功能
- c++ --------- 多态下的菱形继承,菱形虚拟继承
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算