在基类本身中定义"pure"虚函数有什么意义吗?

Does it make any sense to define "pure" virtual functions in the base class itself?

本文关键字:什么 函数 pure 基类 定义      更新时间:2023-10-16

在基类中定义公共虚函数的好处是,我们不必在派生类中重新定义它们。

即使在基类中定义虚函数,也必须在派生类中定义它们。
#include <iostream>
using namespace std;
class speciesFamily
{
    public:
        virtual void numberOfLegs () = 0;
};
void speciesFamily :: numberOfLegs ()
{
    cout << "nFour";
}
class catFamily : public speciesFamily
{
    public:
        void numberOfLegs ()
        {
            speciesFamily :: numberOfLegs ();
        }
};

这可能看起来很花哨,但是在基类本身中定义纯虚函数是否有有益的 ?

两件事:

首先,有一个经常被引用的border-line场景:假设您想要一个抽象基类,但是您没有可以放入虚函数。这意味着没有函数可以变成纯虚函数。现在有一种解决方法:由于总是需要虚析构函数,因此可以将其设为纯函数。但你也需要一个实现,所以这是你的候选:
struct EmptyAbstract
{
  virtual ~EmptyAbstract() = 0; // force class to be abstract
};
EmptyAbstract::~EmptyAbstract() { } // but still make d'tor callable

这可以帮助您最小化抽象类的实现大小。这在某种程度上是一个微优化,但如果它符合语义,那么有这个选项是好的。

第二点是,你总是可以从派生类调用基类函数,所以你可能只是想要一个"通用"的特性集,尽管不想要任何抽象实例。再一次,出现了纯虚定义函数:

struct Base
{
  virtual void foo() = 0;
};
struct Derived : Base
{
  virtual void foo()
  {
    Base::foo();  // call common features
    // do other stuff
  }
};
void Base::foo() { /* common features here */ }
在基类本身中定义纯虚函数是否有任何有利的情况?

是——如果所讨论的函数是纯虚析构函数,它必须也由基类定义。

只有纯虚函数的基类就是Java等语言所称的接口。它只是描述了可用的函数,没有其他内容。

在没有合理实现纯虚函数时可以在基类中使用。在这种情况下,纯虚函数在派生类中实现。