我知道在构造函数中调用虚函数会导致未定义的行为。 但是,使用范围修饰符调用虚函数是否可以?
class A
{
public:
A() { A::f(); }
virtual void f();
};
class B
{
public:
B() { B::f(); }
virtual void f();
};
我认为它与调用非虚函数没有什么不同,它没有任何问题。 这样对吗?或者我忽略了什么?
答案 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)
你的例子很好,理解它的行为就像你调用非虚函数一样。我认为这是你的意图。