在 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++ 中调用受保护的虚拟方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章