【发布时间】:2014-10-25 04:22:54
【问题描述】:
我(希望)理解了私有虚函数的用途,但我不明白为什么我应该有一个私有的纯虚函数! 我的意思是,我必须在所有派生类中定义这个函数,但是这样所有对这个虚拟 pure 的调用都将是对派生类中定义的调用。
假设我们有:
class Base{
public:
void foo(){ bar(); }
private:
virtual void bar() =0 {/*something*/}
};
Base 的派生类必须定义 bar(或者让它成为纯虚拟的,但暂时忘记这一点)。 因为 Base::bar 是私有的,它不能被派生类使用。 因为 Base 是抽象的,我无法创建 Base 对象,因此我只能在派生类上调用 foo ,但这意味着永远不会调用 Base::bar ! 当然,我可以定义 foo:
void Base::foo(){
bar();
Base::bar();
}
但是为了什么?用bar的body定义一个非virtual private函数(并用它替换Base::bar),让pure virtual的body为空不是更好吗?
如果是这样,我为什么要设置 bar 私有(并且不受保护)?
PS:我试图在互联网上找到解决方案,我知道有类似 -> C++: Private virtual functions vs. pure virtual functions 的帖子,但它们有助于理解私有虚函数,而不是私有 PURE 虚函数。如果我错了,请原谅我!
【问题讨论】:
-
virtual void bar() =0 {/*something*/}? -
如果您要求的是纯虚函数,则不必提供定义。
-
@T.C.我想你删除了我正在回复的评论。
-
@NikBougalis 哦,我明白你的意思了。我在谈论“因为 Base 是抽象的,我无法创建 Base 对象,因此我只能在派生类上调用 foo”。我并不是要建议使用纯虚拟来禁用构造。
-
私有纯虚函数在NVI(Non-Virtual Implementation)中很有用,它是模板方法模式,查看Scott Meyers的中的原则35。
标签: c++ virtual private abstract