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

Can I call a virtual function in a constructor?

本文关键字:函数 调用 构造函数      更新时间:2023-10-16

我知道在构造函数中调用虚函数会导致未定义的行为。然而,用作用域修饰符调用虚函数是可以的?

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

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

您可以在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。-end example]

您的示例很好,理解它的行为将完全像调用非虚函数一样。我猜这是你的意图。