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

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

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

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

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

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

请阅读:

【讨论】:

    【解决方案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

      【讨论】:

      • 谢谢你是对的,我的问题表述得很糟糕,更正了
      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2017-01-15
      • 2013-01-18
      • 2018-10-12
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多