c++构造函数中调用虚函数的原理剖析

来源:互联网 发布:linux下压缩文件命令 编辑:程序博客网 时间:2024/06/05 23:46

问题1:C++中构造函数中调用虚函数,能实现多态吗?

答:不能。这里主要涉及到vptr的分步初始化问题。

我们先回忆一下多态的实现原理

a.当类中定义了虚函数方法时,该类就会生成一张虚函数表,其中记录虚函数的入口地址。

b.存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)。vptr指针是存储在对象的内存空间的


然后关于vptr指针,会有一个分步初始化的问题。

比如创建子类对象  child c1;

假设child类和parent类都声明有虚函数,这个时候就会涉及到vptr指针的分步初始化。

首先,会执行父类的构造函数,此时 c1.vptr 会指向父类的虚函数表,如果此时父类构造函数中调用了一个虚函数,那么肯定就会去找父类的虚函数表,

就必然达不到多态的效果。

当父类的构造函数运行完毕,会把c1.vptr指针指向子类的虚函数表。

这个时候子类c1.vptr指针的分步初始化完成。


问题2:C++中构造函数可以为虚函数吗?

答:不能。你可以这样想,什么时候会调用构造函数?当然是创建类的对象的时候,会调用构造函数,对吧。

而构造一个类的对象的步骤,第一步,是不是需要分配一块内存(对于堆栈或者静态存储区),然后第二步就是调用构造函数。

此时,如果构造函数为虚函数,会发生什么?通过上面讲解的我们知道,vptr指针是存储在对象的内存空间的,而此时面对的是一块

还没有进行初始化的内存,也就是vptr指针还没有初始化,你到哪儿去找虚函数表?其实,虚函数表是在构造函数中才初始化的,并不是在这之前。因此构造函数不能为虚函数。

而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有必要成为虚函数


0 0
原创粉丝点击