13

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

即使我们在基类本身中定义了虚函数,我们仍然必须在派生类中定义它们。

#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 ();
        }
};

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

4

4 回答 4

14

两件事情:

首先,有一个经常被引用的边界线场景:假设您想要一个抽象基类,但您没有要放入的虚函数。这意味着您没有使纯虚拟化的功能。现在有一种解决方法:由于您总是需要一个虚拟析构函数,因此您可以将其设为纯析构函数。但是你还需要一个实现,所以这是你的候选人:

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 */ }
于 2011-11-09T11:27:27.400 回答
11

在基类本身中定义纯虚函数是否有好处?

是的——如果有问题的函数是纯虚析构函数,它也必须由基类定义。

于 2011-11-09T11:12:53.437 回答
0

只有纯虚函数的基类是像 Java 这样的语言所称的接口。它只是描述了可用的功能,仅此而已。

于 2011-11-09T11:01:23.687 回答
0

当基类中没有纯虚函数的合理实现时,这可能是有益的。在这种情况下,纯虚函数在派生类中实现。

于 2011-11-09T11:02:58.507 回答