C ++:私有虚函数与纯虚函数[重复]
Posted
技术标签:
【中文标题】C ++:私有虚函数与纯虚函数[重复]【英文标题】:C++: Private virtual functions vs. pure virtual functions [duplicate] 【发布时间】:2012-08-27 10:00:07 【问题描述】:可能重复:Private virtual method in C++
如果我从这篇文章 (Private virtual method in C++) 中理解正确,那么在基类中创建虚函数会使派生类能够覆盖它。但似乎事情到此为止了。
但是如果基类虚函数是纯的,那会强制派生类实现该函数。因此,纯(公共)虚函数只是一个接口。我可以在这里看到一个好处。
另一方面,通过将基类虚函数设为私有,只赋予派生类覆盖该函数的能力,但我认为这没有任何好处。就好像那个私有虚拟功能甚至不存在一样。派生类显然不知道基类中存在该虚函数,因为它是私有的,那么在继承或多态方面声明基类私有函数虚拟有什么好处?
另外,在任何情况下,基类会声明一个函数“纯虚拟”和“私有”吗?
谢谢。
【问题讨论】:
【参考方案1】:一个好处是实施template method pattern:
class Base
public :
void doSomething()
doSomething1();
doSomething2();
doSomething3();
private:
virtual void doSomething1()=0;
virtual void doSomething2()=0;
virtual void doSomething3()=0;
;
class Derived : public Base
private:
virtual void doSomething1() ...
virtual void doSomething2() ....
virtual void doSomething3() ....
这允许派生类实现特定逻辑的每一部分,而基类决定如何将这些部分组合在一起。由于这些片段本身没有意义,因此它们被声明为private
,因此对客户端代码隐藏。
【讨论】:
【参考方案2】:它适用于 base 希望其子级实现 base 本身需要使用的功能的情况。想象一个愚蠢的例子——汽车。
class Car
public:
int getTorque();
int getPower();
private:
virtual const Engine& gimmeEngine() = 0;
;
class Ferrari : public Car
private:
FerrariEngine myCoolEngine;
const Engine& gimmeEngine() return myCoolEngine;
;
现在 Car 不需要知道任何关于法拉利引擎的信息,只需要它实现一些Engine
接口,保证Car
可以获取有关其功率和扭矩的信息。
在这个愚蠢的例子中,一切都可以通过将getTorque
和getPower
设为纯虚拟来简化,但我希望它能说明这个想法。 Base
需要使用它知道每个孩子必须拥有的一些特定逻辑,因此它通过一个私有的纯虚拟成员来查询它。
【讨论】:
【参考方案3】:如果方法是虚拟的,它可以被派生类覆盖,即使它是私有的。无论如何,它应该用protected声明。
【讨论】:
如果您知道永远不需要从派生类访问基方法,为什么还要声明它受保护?您可以覆盖某些内容而无需调用它。 parashift.com/c++-faq-lite/private-virtuals.html 没有理由应该声明为protected
。如果您需要protected
,请使用它。如果没有,则使用private
。以上是关于C ++:私有虚函数与纯虚函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章