【问题标题】:Can I call a virtual function in a constructor?我可以在构造函数中调用虚函数吗?
【发布时间】:2014-09-02 15:26:57
【问题描述】:

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

class A
{

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

};

class B
{

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

};

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

【问题讨论】:

  • 可以,但不会进行虚拟调度。不过,我还没有听说 UB 是由正常调用它们引起的。
  • 构造函数的虚拟调用的行为没有任何未定义的地方。
  • 注意:在构造函数中调用虚函数并不是未定义的行为(可能是意料之外的)
  • @chris: 如果你调用一个没有实现的纯虚函数,可能会有未定义的行为......
  • @MooingDuck,非常正确。

标签: c++ constructor virtual


【解决方案1】:

您可以拨打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。 —结束示例]

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多