各位大牛,谁能帮我解释下“虚函数在构造函数中的行为”,C++编程思想这一节没看懂
时间:2011-12-14
来源:互联网
能不能帮我解释下,在构造函数中调用虚函数,发生什么现象?我知道在构造函数中调用虚函数,是不好的编程习惯,按照"google C++编程规范"中所述,构造函数只要保证对象完整的初始化即可。希望大牛们从逻辑上分析下“虚函数在构造函数中的行为”,感激不尽...
虚函数的调用是在运行时决定的,编译时这个对象并不能知道它是属于这个成员属于基类,还是派生类。但是构造函数好像是一个例外.
"虚机制在构造函数中部工作",对于在构造函数中调用一个虚函数的情况,被调用的只是这个函数的本地版本,这是什么意思?
虚函数的调用是在运行时决定的,编译时这个对象并不能知道它是属于这个成员属于基类,还是派生类。但是构造函数好像是一个例外.
"虚机制在构造函数中部工作",对于在构造函数中调用一个虚函数的情况,被调用的只是这个函数的本地版本,这是什么意思?
作者: halonar 发布时间: 2011-12-14
“虚函数在构造函数中不工作”是指如果在基类构造函数中调用虚函数,它实际调用的是基类中的函数,这是在编译时就定下来的,不想其他虚函数是运行时绑定。
例子:
C/C++ code
这个例子中,base类构造函数实际调用的是base::f()而非derived::f(),虽然你要构造的是derived对象。
C++这样规定的原因是和对象的构造顺序有关,构造派生类对象时一定是先构造它属于基类对象的那部分,然后构造子类对象部分。在构造基类部分时,子类部分都还没有开始构造,如果调用到派生类的那个虚函数实现,可能会有问题,因为后者很可能访问派生类中才有的数据成员,而这些成员都还没有初始化。所以,记住这个规则(虽然语言本身并没有禁止):不要在构造函数(或析构函数,原因类似)中调用虚函数。
顺便说一下,注意提高结帖率,这样会有更多的人来回答;)
例子:
C/C++ code
class base { public: base() { f(); } virtual f() { cout << "base::f()\n"; } }; class derived: public base { public: virtual f() { cout << "derived::f()\n"; } }; derived d;
这个例子中,base类构造函数实际调用的是base::f()而非derived::f(),虽然你要构造的是derived对象。
C++这样规定的原因是和对象的构造顺序有关,构造派生类对象时一定是先构造它属于基类对象的那部分,然后构造子类对象部分。在构造基类部分时,子类部分都还没有开始构造,如果调用到派生类的那个虚函数实现,可能会有问题,因为后者很可能访问派生类中才有的数据成员,而这些成员都还没有初始化。所以,记住这个规则(虽然语言本身并没有禁止):不要在构造函数(或析构函数,原因类似)中调用虚函数。
顺便说一下,注意提高结帖率,这样会有更多的人来回答;)
作者: tonywearme 发布时间: 2011-12-14
引用 1 楼 tonywearme 的回复:
“虚函数在构造函数中不工作”是指如果在基类构造函数中调用虚函数,它实际调用的是基类中的函数,这是在编译时就定下来的,不想其他虚函数是运行时绑定。
例子:
C/C++ code
class base
{
public:
base() { f(); }
virtual f() { cout << "base::f()\n"; }
};
class de……
“虚函数在构造函数中不工作”是指如果在基类构造函数中调用虚函数,它实际调用的是基类中的函数,这是在编译时就定下来的,不想其他虚函数是运行时绑定。
例子:
C/C++ code
class base
{
public:
base() { f(); }
virtual f() { cout << "base::f()\n"; }
};
class de……
++
作者: Demon__Hunter 发布时间: 2011-12-14

呆猪天天看到你,帮我看个问题
另外#1解释很完整了,之所以叫虚函数是因为实现不同,实现不同就说明虚函数很可能调用自己本类的数据,而派生类构造的时候会先去构造基类,基类进入构造函数体内部时会先进行初始化列表,当进入到函数体内部时,基类的数据就已经被初始化了,这个时候派生类的数据成员还没有被初始化,所以编译器强制规定了在基类的构造函数内调用虚函数只会调用基类的虚函数,调用派生类的会导致未定义行为
作者: qscool1987 发布时间: 2011-12-14
请您阅读《 effective c++》第三版 第九节 关于这个问题的论述
作者: nwao7890 发布时间: 2011-12-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28