在C ++中调用受保护的虚方法

时间:2012-03-30 14:28:04

标签: c++

  

可能重复:
  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"

4 个答案:

答案 0 :(得分:3)

从构造函数调用受保护的函数没有问题 - 只需这样做。但是,你似乎想要的是调用一个具体的派生类的实现,例如,ExtendedFoo,因为它是虚拟的 - 对吗?这是不行的,因为在Foo构造函数中,正在创建的对象仍然是Foo类型,而不是ExtendedFoo,因此不能进行虚拟调度。如果受保护的函数不是纯虚拟的,则调用Foo实现,即构造函数将调用类的自己的实现。

答案 1 :(得分:1)

考虑到调用基础构造函数时,实际构造函数仍然没有,因此对象未完全形成。

如果您的对象尚未形成,则不能指望它正确行动。

请阅读:

答案 2 :(得分:0)

你可以,但是你会得到Foo的实施,因为ExtendedFoo没有被构建。这是定义的。

类似问题:C++ design pattern: multiple ways to load file

答案 3 :(得分:0)

问题更改后弃用的答案:

如果在 ExtendedFoo 中受到保护,则无法从 ExtendedFoo 之外调用它。这条线...

exFoo.printStuff();

违反了该功能的保护级别。

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm