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

calling a protected virtual method in C++

本文关键字:虚拟 方法 受保护 调用 C++      更新时间:2023-10-16

可能重复:
在基类构造函数中调用虚拟方法
调用构造函数内部的虚拟函数

如何从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"

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

请考虑,当调用基本构造函数时,实际构造函数仍然没有,因此对象不是完全形成的。

如果你的物体还没有成形,你就不能指望它能正确地行动。

请阅读:

  • 在构建或销毁过程中永远不要调用虚拟函数
  • [10.7]您应该在构造函数中使用this指针吗

您可以,但您将获得Foo的实现,因为ExtendedFoo尚未构造。这是有定义的。

类似的问题:C++设计模式:多种方式加载文件

问题更改后不推荐使用的答案:

如果它在ExtendedFoo中受到保护,则不能从ExtendFoo

exFoo.printStuff();

违反了功能的保护级别。

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