可能重复:
Calling virtual method in base class constructor
Calling virtual functions inside constructors
如何从C ++中的构造函数调用受保护的虚方法?
class Foo
{
Foo(){
printStuff(); // have also tried this->printStuff()
}
protected:
virtual void printStuff() {}
}
class ExtendedFoo : public Foo {
protected:
virtual void printStuff() { cout << "Stuff" << endl;}
}
...
ExtendedFoo exFoo; // should print "Stuff"
答案 0 :(得分:3)
从构造函数调用受保护的函数没有问题 - 只需这样做。但是,你似乎想要的是调用一个具体的派生类的实现,例如,ExtendedFoo,因为它是虚拟的 - 对吗?这是不行的,因为在Foo构造函数中,正在创建的对象仍然是Foo类型,而不是ExtendedFoo,因此不能进行虚拟调度。如果受保护的函数不是纯虚拟的,则调用Foo实现,即构造函数将调用类的自己的实现。
答案 1 :(得分:1)
考虑到调用基础构造函数时,实际构造函数仍然没有,因此对象未完全形成。
如果您的对象尚未形成,则不能指望它正确行动。
请阅读:
答案 2 :(得分:0)
你可以,但是你会得到Foo
的实施,因为ExtendedFoo
没有被构建。这是定义的。
答案 3 :(得分:0)
问题更改后弃用的答案:
如果在 ExtendedFoo 中受到保护,则无法从 ExtendedFoo 之外调用它。这条线...
exFoo.printStuff();
违反了该功能的保护级别。