我知道在构造函数中调用虚函数可能会导致未定义行为。 但是,使用范围修饰符调用虚函数是可以的吗?
class A
{
public:
A() { A::f(); }
virtual void f();
};
class B
{
public:
B() { B::f(); }
virtual void f();
};
我认为调用非虚函数和调用虚函数没有什么区别,并且也不会出现任何问题。这样说是否正确?或者我有什么遗漏吗?
我知道在构造函数中调用虚函数可能会导致未定义行为。 但是,使用范围修饰符调用虚函数是可以的吗?
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
。── 结束示例]
Derived::Derived() { Base* b = this; b->f(); }
可能会调用Derived::f()
。 - aschepler