抽象基类的抽象子类

Abstract subclass of abstract base class

本文关键字:抽象 子类 基类      更新时间:2023-10-16

我有一个抽象基类。假设,我希望派生类也是抽象的,并将实现纯虚拟函数的责任留给更低级的类。最好的方法是什么?

class Animal {
public:
    virtual void makeNoise() = 0;
};
class Dog : public Animal {
};

是这样留空更好,还是我应该这样做:

class Dog : public Animal {
public:
    virtual void makeNoise() = 0;
};

或者忽略虚拟关键字和:

class Dog : public Animal {
public:
    void makeNoise() = 0;
};

做这件事最合适的方式是什么?

不同选项之间没有功能差异(因为您没有更改可访问性),但

  • 我更喜欢选项一,因为它可以避免代码重复
  • 选项3是最坏的可能性,因为尽管纯虚拟函数(由=0表示)显然是虚拟的,但它与Dog中引入的其他(纯)虚拟函数的声明不太一致
  • 如果,我只会恢复到选项2

    • Dog是您分发给他人的库的一部分
    • 它本身引入了新的纯虚拟函数
    • Animal本身不应该被"典型用户"直接进一步使用

    通过这种方式,从Dog派生的客户端具有关于他必须在一个地方实现哪些功能的所有必要信息。