C++虚拟专用函数与纯虚函数

C++: Private virtual functions vs. pure virtual functions

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Private virtual method in C++

如果我从这篇文章(C++中的私有虚拟方法)正确理解,在基类中生成虚拟函数使派生类能够重写它。但事情似乎到此为止。

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

另一方面,通过将基类虚函数设为私有,只给派生类重写函数的能力,但我看不到这一点的好处。就好像那个私有的虚拟功能根本不存在一样。派生类显然不知道该虚拟函数在基类中的存在,因为它是私有的,所以从继承或多态性的角度来声明基类私有函数是虚拟的有什么好处吗?

此外,是否存在基类声明函数"纯虚拟"和"私有"的情况?

谢谢您。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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,因此对客户机代码隐藏起来。


它适用于BASE希望其子级实现基础本身需要使用的功能的情况。想象一个愚蠢的例子——汽车。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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; }
};

现在,汽车不需要了解法拉利的引擎,只需要实现一些Engine接口,保证Car可以获得有关其功率和扭矩的信息。

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


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