8

可能重复:
C++ 中的私有虚拟方法

如果我从这篇文章( C++ 中的私有虚拟方法)中理解正确,那么在基类中创建一个虚拟函数会使派生类能够覆盖它。但似乎事情到此为止了。

但是如果基类虚函数是纯的,那会强制派生类实现该函数。因此,纯(公共)虚函数只是一个接口。我可以在这里看到一个好处。

另一方面,通过将基类虚函数设为私有,只赋予派生类覆盖该函数的能力,但我看不出这样做有什么好处。就好像那个私有虚拟功能甚至不存在一样。派生类显然不知道基类中存在该虚拟函数,因为它是私有的,那么在继承或多态方面声明基类私有函数虚拟有什么好处?

另外,在任何情况下,基类会声明一个函数“纯虚拟”和“私有”吗?

谢谢你。

4

3 回答 3

14

一个好处是实现模板方法模式

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因此它们被声明并隐藏在客户端代码中。

于 2012-09-02T09:20:26.607 回答
3

它适用于 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需要使用它知道每个孩子必须拥有的某些特定逻辑,因此它通过私有纯虚拟成员对其进行查询。

于 2012-09-02T09:27:07.210 回答
0

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

于 2012-09-02T09:21:37.077 回答