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 可以获取有关其功率和扭矩的信息。

在这个愚蠢的例子中,一切都可以通过将getTorquegetPower 设为纯虚拟来简化,但我希望它能说明这个想法。 Base 需要使用它知道每个孩子必须拥有的一些特定逻辑,因此它通过一个私有的纯虚拟成员来查询它。

【讨论】:

【参考方案3】:

如果方法是虚拟的,它可以被派生类覆盖,即使它是私有的。无论如何,它应该用protected声明。

【讨论】:

如果您知道永远不需要从派生类访问基方法,为什么还要声明它受保护?您可以覆盖某些内容而无需调用它。 parashift.com/c++-faq-lite/private-virtuals.html 没有理由应该声明为protected。如果您需要protected,请使用它。如果没有,则使用private

以上是关于C ++:私有虚函数与纯虚函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c++11纯虚类之友无法访问私有方法

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

C++ 为啥我可以从派生类调用基类的私有虚函数?

私有继承导致c ++中的问题[重复]

使用使析构函数私有[重复]

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?