+ -
当前位置:首页 → 问答吧 → 各位大牛,谁能帮我解释下“虚函数在构造函数中的行为”,C++编程思想这一节没看懂

各位大牛,谁能帮我解释下“虚函数在构造函数中的行为”,C++编程思想这一节没看懂

时间:2011-12-14

来源:互联网

能不能帮我解释下,在构造函数中调用虚函数,发生什么现象?我知道在构造函数中调用虚函数,是不好的编程习惯,按照"google C++编程规范"中所述,构造函数只要保证对象完整的初始化即可。希望大牛们从逻辑上分析下“虚函数在构造函数中的行为”,感激不尽...
  虚函数的调用是在运行时决定的,编译时这个对象并不能知道它是属于这个成员属于基类,还是派生类。但是构造函数好像是一个例外.
  "虚机制在构造函数中部工作",对于在构造函数中调用一个虚函数的情况,被调用的只是这个函数的本地版本,这是什么意思?
 

作者: halonar   发布时间: 2011-12-14

“虚函数在构造函数中不工作”是指如果在基类构造函数中调用虚函数,它实际调用的是基类中的函数,这是在编译时就定下来的,不想其他虚函数是运行时绑定。

例子:
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……

++

作者: Demon__Hunter   发布时间: 2011-12-14


呆猪天天看到你,帮我看个问题
另外#1解释很完整了,之所以叫虚函数是因为实现不同,实现不同就说明虚函数很可能调用自己本类的数据,而派生类构造的时候会先去构造基类,基类进入构造函数体内部时会先进行初始化列表,当进入到函数体内部时,基类的数据就已经被初始化了,这个时候派生类的数据成员还没有被初始化,所以编译器强制规定了在基类的构造函数内调用虚函数只会调用基类的虚函数,调用派生类的会导致未定义行为

作者: qscool1987   发布时间: 2011-12-14

请您阅读《 effective c++》第三版 第九节 关于这个问题的论述

作者: nwao7890   发布时间: 2011-12-14