C++中虚函数和多态
2012-07-22 16:10
134 查看
[b]1.C++中的虚函数[/b]
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)和一个指向虚函数表的指针(vptr)来实现的。虚函数表,简称为vtbl,虚函数表表对实现多态起着至关重要的作用。在这个表中,主要保存了一个类中的虚函数的地址,这张表解决了继承、覆盖的问题,保证其内容能真实反应实际的函数。每一个包含虚函数的类的实例都包含一个cptr指针,指向虚函数表的首地址。我们可以通过这个指针找到要访问的虚函数的,完成虚函数的调用主要包括:找到虚函数表的首地址(vptr),通过cptr找到要使用虚函数地址,调用虚函数。那么使用虚函数大家总要考虑效率的问题,实际上为了提高效率,C++的编译器是保证虚函数表的指针存在于对象实例中最前面的位置,这是为了保证取到虚函数表的有最高的性能,这意味着我们通过对象实例的地址得到这张虚函数表,然后通过遍历表就可以找到其中的虚函数的地址,然后调用相应的函数。不妨看看下面的代码:
View Code
实现虚函数的代码,一定要切记:一定是基类的指针指向子类的对象的地址。首先试着理解一下用虚函数实现多态的原理,如果实在没理解为什么虚函数能实现多态,又为什么这样实现多态,上网再搜一搜相关的资料!!!
学习中的一点总结,欢迎拍砖^^
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)和一个指向虚函数表的指针(vptr)来实现的。虚函数表,简称为vtbl,虚函数表表对实现多态起着至关重要的作用。在这个表中,主要保存了一个类中的虚函数的地址,这张表解决了继承、覆盖的问题,保证其内容能真实反应实际的函数。每一个包含虚函数的类的实例都包含一个cptr指针,指向虚函数表的首地址。我们可以通过这个指针找到要访问的虚函数的,完成虚函数的调用主要包括:找到虚函数表的首地址(vptr),通过cptr找到要使用虚函数地址,调用虚函数。那么使用虚函数大家总要考虑效率的问题,实际上为了提高效率,C++的编译器是保证虚函数表的指针存在于对象实例中最前面的位置,这是为了保证取到虚函数表的有最高的性能,这意味着我们通过对象实例的地址得到这张虚函数表,然后通过遍历表就可以找到其中的虚函数的地址,然后调用相应的函数。不妨看看下面的代码:
View Code
#include <iostream> using namespace std; class Base { public: virtual void Print() { cout<<"Base::Print()"<<endl; } }; class Derive : public Base { public: virtual void Print() { cout<<"Derive::Print()"<<endl; } }; int main() { Derive derive; Base *pBase = &derive; pBase->Print(); return 0; } //多态代码
实现虚函数的代码,一定要切记:一定是基类的指针指向子类的对象的地址。首先试着理解一下用虚函数实现多态的原理,如果实在没理解为什么虚函数能实现多态,又为什么这样实现多态,上网再搜一搜相关的资料!!!
学习中的一点总结,欢迎拍砖^^
相关文章推荐
- c++ 多态之虚函数一例
- C++多态机制中虚函数和指针或引用
- C++多态:深入虚函数,理解晚绑定
- C++多态实现(虚函数,成员函数覆盖、隐藏)
- 2017 程序设计实习之C++部分作业题汇总 - E:多态与虚函数
- C++ 多态和虚函数
- [C++基础]重载、覆盖、多态与函数隐藏(4)
- C++多态及虚函数的理解和使用
- c++中多态函数以及函数重载,覆盖,遮蔽(隐藏)的区别
- C++中虚函数与多态
- C++之多态和虚函数
- C++多态和虚函数
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- PKU C++程序设计实习 学习笔记3 多态与虚函数
- C++多态与虚函数
- 对C++中虚函数、纯虚函数在多态中作用的一点认识
- [C++基础]重载、覆盖、多态与函数隐藏(1)
- C++之探索多态的本质(虚函数与虚表)2
- C++ 类的多态二(函数重载--函数重写--函数重定义)
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配