C ++:私有虚函数与纯虚函数

时间:2012-09-02 09:16:41

标签: c++ function virtual private

  

可能重复:
  Private virtual method in C++

如果我从这篇文章中正确理解(Private virtual method in C++),在基类中创建虚函数会使派生类能够覆盖它。但似乎事情就止于此了。

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

另一方面,通过将基类虚函数设为私有,只允许派生类重写该函数,但我认为没有任何好处。这就好像私有虚拟功能甚至不存在。派生类显然不知道基类中是否存在该虚函数,因为它是私有的,因此在继承或多态方面声明基类私有函数virtual有什么好处吗?

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

谢谢。

3 个答案:

答案 0 :(得分:12)

实施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,因此对客户端代码隐藏起来。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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