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指针还没有初始化,你到哪儿去找虚函数表?其实,虚函数表是在构造函数中才初始化的,并不是在这之前。因此构造函数不能为虚函数。
而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有必要成为虚函数
- c++构造函数中调用虚函数的原理剖析
- C++:构造函数中调用虚函数
- C++:构造函数中调用虚函数
- 解析构造函数与析构函数中 调用虚函数的原理
- c语言中函数调用的原理
- c语言中函数调用的原理
- 【C++】拷贝构造函数的剖析
- C++中构造函数中调用虚函数的问题
- C++中构造函数中调用虚函数的问题
- C++中构造函数中调用虚函数的问题
- C++/C#的区别之在构造函数中调用虚函数
- 函数调用 中 的拷贝构造函数
- 看C++中构造函数的调用顺序
- 在子类的构造函数中调用虚函数
- 构造函数 中调用虚函数的问题
- C++构造函数中不调用虚函数的原因
- c++:在类的构造函数中调用另一个构造函数
- 在构造函数中调用虚函数
- 关于博客Read More按钮的改进
- 原生JDBC中存在的主要问题总结
- 简单的js验证输入框的方法
- @Resource注入的bean为空浅析
- 防止IE被修改
- c++构造函数中调用虚函数的原理剖析
- DNS查询指令:host 、nslookup 、dig 详解
- Maven学习总结(一)——Maven入门
- char* 和char[]的区别
- 各种排序算法
- Myeclipse server报错 Could not create the view: An unexpected exception was thrown.问题解决
- JAVA中protected的作用
- iOS证书的选择
- PDO多种方式取得查询结果