【C++学习笔记】深入理解虚函数和多态
文章目录
- 1. 基本概念
- 1.1 虚函数
- 1.2 虚函数表
- 1.3 虚函数表指针
- 1.4 虚函数表在支持多态方面的工作原理
- 2. 类对象在内存中的布局
- 参考
1. 基本概念
1.1 虚函数
类的成员函数,并不占用类对象的内存空间。
类中有虚函数,编译器会向类中插入一个看不见的成员变量,类似下面的伪代码:
class A
{public:void *vptr; //虚函数表指针(virtual table pointer)//......
};
这个看不见的成员变量,就叫虚函数表指针
1.2 虚函数表
虚函数表的生成时机:
在编译过程中,当类A中虚函数个数≥1个,编译器就会为类A生成一个虚函数表(virtual table),这个虚函数表会一直伴随着类A,编译完成,在程序执行的时候,也会被加载到内存中。
1.3 虚函数表指针
1.4 虚函数表在支持多态方面的工作原理
多态必须存在虚函数,没有虚函数,绝不可能存在多态
从代码实现上:
class Base
{public:virtual void myvirfunc(){}
};int main()
{Base*pa = new Base();pa->myvirfunc();//这是不是多态,是多态的Base base;base.myvirfunc();//这个就不是多态的Base* ybase = &base;ybase->myvirfunc();//这个也是多态
}
从表现形式上:
- 程序中既存在父类也存在子类,父类中必须含有虚函数,子类中也必须重写父类中的虚函数。
- 父类指针指向子类对象,或者父类引用绑定(指向)子类对象。
- 当通过父类的指针或引用,调用子类中重写的虚函数时,就能看出多态性的表现了。
class Derive:public Base
{
public:
virtual void myvirfunc(){}
};
/父类指针指向子类对象
Derive derive;
Base*pbase =&derive;
pbase->myvirfunc();//Derive:myvirfunc()
/或者
Base*pbase2=new Derive();//释放内存请自行释放,在这里没演示
pbase2->myvirfunc();//Derive:myvirfunc()
//父类用绑定(指向)子类对象
Derive derive2;
Base&yinbase derive2;
yinbase.myvirfunc();//Derive:myvirfunc()
2. 类对象在内存中的布局
TBD.
参考
【1】C++ 多态
【2】C++ 一篇搞懂多态的实现原理
【3】C++ 多态 超详细讲解
【4】[C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
【5】CPU眼里的:多态
【6】C++语言面试中,如何深入理解虚函数和多态?
【7】侯捷谈虚函数与多态(上)
【8】侯捷谈虚函数与多态(下)