我可以在构造函数中调用虚函数吗?

时间:2014-07-11 22:04:51

标签: c++ constructor virtual

我知道在构造函数中调用虚函数会导致未定义的行为。 但是,使用范围修饰符调用虚函数是否可以?

class A
{

public:
A() { A::f(); }
virtual void f();

};

class B
{

public:
B() { B::f(); }
virtual void f();

};

我认为它与调用非虚函数没有什么不同,它没有任何问题。 这样对吗?或者我忽略了什么?

2 个答案:

答案 0 :(得分:2)

通过A::f()中的A::A()B::f()中的B::B(),您就可以了。当使用显式限定调用函数时,不使用虚拟调用机制。

这就是标准草案中关于在调用虚函数时使用显式限定的说法:

  

10.3 / 15范围运算符(5.1)的显式限定禁止虚拟调用机制。 [例如:

class B { public: virtual void f(); };
class D : public B { public: void f(); };
void D::f() { / ... / B::f(); }
  

此处,D::f中的函数调用确实调用了B::f而不是D::f。 - 例子]

答案 1 :(得分:1)

你的例子很好,理解它的行为就像你调用非虚函数一样。我认为这是你的意图。