在 C++ 中调用受保护的虚拟方法 [重复]

Posted

技术标签:

【中文标题】在 C++ 中调用受保护的虚拟方法 [重复]【英文标题】:calling a protected virtual method in C++ [duplicate] 【发布时间】:2012-03-30 14:28:03 【问题描述】:

可能重复:Calling virtual method in base class constructorCalling 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"

【问题讨论】:

另见***.com/questions/962132/… 【参考方案1】:

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

【讨论】:

根据标准,在构造函数中调用纯虚成员是未定义的行为。 是的,这就是为什么我写了对非纯虚函数的调用将“成功”的原因。【参考方案2】:

考虑到当你的基础构造函数被调用时,你的实际构造函数仍然没有,所以你的对象还没有完全形成。

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

请阅读:

Never Call Virtual Functions during Construction or Destruction。 [10.7] Should you use the this pointer in the constructor?

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

问题更改后已弃用答案:

如果它在 ExtendedFoo 中受到保护,则不能从 ExtendedFoo 之外调用它。线...

exFoo.printStuff();

违反了函数的保护级别。

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

【讨论】:

谢谢你是对的,我的问题表述得很糟糕,更正了

以上是关于在 C++ 中调用受保护的虚拟方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法访问子类中的受保护方法[重复]

c ++中受保护的派生和私有派生有啥区别[重复]

派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?

C ++虚拟+受保护?

在 C# 中调用类的受保护构造函数

使用抽象基类的C ++“调用纯虚拟方法”[重复]