谈谈c++中继承中的虚函数
2014-05-15 11:25
106 查看
c++是一种面向对象的编程语言的一个很明显的体现就是对继承机制的支持,c++中继承分很多种,按不同的分类有不同分类方法,比如可以按照基类的个数分为多继承和单继承,可以按照访问权限分为public继承、protected继承和private继承,按照是否是虚拟继承可以分为virtual继承和non-virtual继承。当然这里的分类标准都是有重叠的部分,比如,non-virtual继承又可以分为单继承和多继承。这里要讨论的是虚函数,因此主要从virtual和non-virtual继承两个方面来展开讨论分析。
1、non-virtual继承
non-virtual继承又有两种情况单继承和多继承。来看一个例子:
建立四个对象:
base1 b1;
base2 b2;
derive1 d1;
derive2 d2;
学习c++的都知道里面的虚函数表,上面的继承体系中各个类的虚函数表如下:
base1的虚函数表如下:
vptr-->base1::f base1::h//vptr为指向类的虚函数表的指针,-->表示的意思是指向一个表,后面的内容是表中的内容
base2的虚函数表如下:
vptr-->base2::g //
derive1的虚函数表如下:
vptr-->derive1::f base1::h derive1::f
derive2的虚函数表如下:
vptr1-->derive2::f base1::h derive2::g1 //base1
vptr2-->derive2::g //base2
在windows开发平台查看虚函数表如下:主机环境为 win7+vs2013(显示的不完全),在调试模式下:
2、virtual继承
虚继承是在多重继承中引入的一种技术,关于虚继承的分析讨论不是本文的重点,不了解的同学可以查看相关的c++书籍,下面要讲的是virtual中的虚函数。
通过vs2013查看虚函数表如下:
本文参考了知名技术博主左耳朵耗子在csdn上的博客,
博客地址为:/article/2551883.html
欢迎大家来讨论交流,欢迎转载,切勿用于商业用途,版权所有,转载必须注明出处。
c++继 承中的虚函数
1、non-virtual继承
non-virtual继承又有两种情况单继承和多继承。来看一个例子:
class base1 { public: virtual void f(){} virtual void h(){} }; class base2 { public: virtual void g(){} }; class derive1:public base1 { public: virtual void f(){} virtual void f1(){} } class derive2:public base1,public base2 { public: virtual void f(){} virtual void g(){} virtual void g1(){} };
建立四个对象:
base1 b1;
base2 b2;
derive1 d1;
derive2 d2;
学习c++的都知道里面的虚函数表,上面的继承体系中各个类的虚函数表如下:
base1的虚函数表如下:
vptr-->base1::f base1::h//vptr为指向类的虚函数表的指针,-->表示的意思是指向一个表,后面的内容是表中的内容
base2的虚函数表如下:
vptr-->base2::g //
derive1的虚函数表如下:
vptr-->derive1::f base1::h derive1::f
derive2的虚函数表如下:
vptr1-->derive2::f base1::h derive2::g1 //base1
vptr2-->derive2::g //base2
在windows开发平台查看虚函数表如下:主机环境为 win7+vs2013(显示的不完全),在调试模式下:
2、virtual继承
虚继承是在多重继承中引入的一种技术,关于虚继承的分析讨论不是本文的重点,不了解的同学可以查看相关的c++书籍,下面要讲的是virtual中的虚函数。
class base1 { public: virtual void f(){} }; class base2 { public: virtual void g(){} }; class derive1:virtual public base1 { public: virtual void f(){} virtual void f1(){} } class derive2:virtual public base1,virtual public base2 { public: virtual void f(){} virtual void g(){} virtual void g1(){} };
通过vs2013查看虚函数表如下:
本文参考了知名技术博主左耳朵耗子在csdn上的博客,
博客地址为:/article/2551883.html
欢迎大家来讨论交流,欢迎转载,切勿用于商业用途,版权所有,转载必须注明出处。
相关文章推荐
- 谈谈c++中继承中的虚函数
- 谈谈C++继承中的重载,覆盖和隐藏
- 谈谈C++继承中的重载,覆盖和隐藏
- 从虚函数的内存构造谈C++继承中函数的覆盖与隐藏
- c++的继承关系和函数重载
- 谈谈C++继承中的重载,覆盖和隐藏
- C++特性探寻-继承、成员函数、this指针
- C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中
- Java与C++区别之继承关系中的函数
- 谈谈C++继承中的重载,覆盖和隐藏2
- C++中包含有虚函数的单继承状态下的类的内存布局
- 谈谈 C++ 的私有继承 (Private Inheritance) 在跨平台(Cross Platform)上的妙用
- 谈谈C++继承中的重载,覆盖和隐藏
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- C++中的virtual函数在继承的类中需要实现
- c++多重继承和虚继承及虚函数深入理解
- 深入剖析C++继承,多态以及隐藏(一)。(虚函数探究)
- C++多继承中重写不同基类中相同原型的虚函数
- c++ 继承 函数重新实现
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定