Purpose of private pure virtual function?
我(希望)已经理解了私有虚拟函数的用途,但我不理解为什么我应该拥有私有纯虚拟函数!我的意思是,我必须在所有派生类中定义这个函数,但是这样,对这个虚拟纯的所有调用都将是对派生类中定义的调用。
假设我们有:
1 2 3 4 5 6 | class Base{ public: void foo(){ bar(); } private: virtual void bar() =0 {/*something*/} }; |
派生的base类必须定义bar(或使其纯虚拟化,但请暂时忽略这一点)。因为base::bar是私有的,所以派生类不能使用它。因为基是抽象的,所以我不能创建基对象,所以只能在派生类上调用foo,但这意味着永远不会调用base::bar!当然,我可以定义foo:
1 2 3 4 | void Base::foo(){ bar(); Base::bar(); } |
但是为了什么呢?用bar的主体(并用它替换base::bar)定义一个非虚拟私有函数,并使纯虚拟的主体为空,这样做不会更好?
如果是这样,为什么我应该把酒吧设为私人的(而不是受保护的)?
PS:我试着在互联网上找到一个解决方案,我知道有些帖子像-> C++:私有虚拟函数与纯虚函数,但是它们有助于理解私有虚拟函数,而不是私有纯虚函数。如果我错了,请原谅我!
因此,一般来说,模式是实现公共的非虚拟功能和私有的或受保护的虚拟功能,看起来您已经对此进行了研究,但这通常被称为模板方法模式,Herb Sutter在这里和这里有更多的解释。
是否将其设为纯虚拟的取决于您的需求,有时绝对没有有意义的默认行为,或者您希望强制所有子类实现其自己的虚拟函数版本。有时候,空的实现是有意义的。然后提供,但会发生的是,其他实现者可能会忘记自定义他们的类,而不是实现为其提供默认行为的虚拟类。这真的是一个个案决定,你将不得不作出。
有些情况下,您需要为纯虚拟函数提供一个实现,Herb Sutter再次列出了两个,一个是提供默认行为,但强制派生类进行谨慎调用,另一个是防止编译器出现可能会被调用纯虚拟函数的问题。
在您的问题所在的地方,有各种各样的问题交织在一起,通常将虚拟函数设为私有的或受保护的,由公共函数调用(同样是模板方法模式)。如果派生类不需要调用超类实现,则将其设为私有的。如果要实现默认行为,请使其受保护,并在更高的类中实现默认行为。如果您想强制子类实现它们自己的函数(独立于是否存在默认行为),请将其设为纯虚拟的。
当然,bar()仍然可以由
通过使bar()成为纯的,这通常具有强制可实例化子类实现bar()或从另一个可实例化类继承的效果。
也许您显式地不希望子类直接调用超类的bar(),并强制子类通过其他一些受保护的方法或两个方法间接调用它…