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

3

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

class A
{

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

};

class B
{

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

};

我认为调用非虚函数和调用虚函数没有什么区别,并且也不会出现任何问题。这样说是否正确?或者我有什么遗漏吗?


2
你可以这样做,但它不会进行虚拟分派。尽管如此,我还没有听说过仅通过正常调用它们就会导致 UB 的情况。 - chris
2
从构造函数中进行虚拟调用的行为并不会出现未定义的情况。 - Cubbi
注意:在构造函数中调用虚函数不是未定义行为(可能会出现意外情况)。 - user2249683
1
@chris:如果你调用一个没有实现的纯虚函数,可能会出现未定义的行为... - Mooing Duck
@chris:Derived::Derived() { Base* b = this; b->f(); } 可能会调用 Derived::f() - aschepler
显示剩余3条评论
2个回答

2
您在调用A::A()中的A::f()B::B()中的B::f()时不需要使用虚函数调用机制,只需使用显式限定即可。

下面是草案标准对于使用显式限定调用虚函数的说明:

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
您的示例很好,只要理解它的行为就像调用非虚函数一样。我假设这是您的意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接