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

Aqu*_*irl 12 c++ pure-virtual

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

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

#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 ();
        }
};
Run Code Online (Sandbox Code Playgroud)

这可能看起来很奇怪,但是在基类本身定义纯虚函数是否有益的情况下是否存在?

Ker*_* SB 14

两件事情:

首先,有一个常见的边界线场景:假设你想要一个抽象基类,但你没有虚拟函数可以放入它.这意味着你没有制作纯虚拟的功能.现在有一种方法:因为你总是需要一个虚拟析构函数,你可以使它纯粹.但是你也需要一个实现,所以这是你的嗜好:

struct EmptyAbstract
{
  virtual ~EmptyAbstract() = 0; // force class to be abstract
};
EmptyAbstract::~EmptyAbstract() { } // but still make d'tor callable
Run Code Online (Sandbox Code Playgroud)

这可以帮助您最小化抽象类的实现大小.它在某种程度上是微观的,但如果它在语义上适合,那么拥有这个选项是件好事.

第二点是你总是可以从派生类中调用基类函数,所以你可能只想拥有一个"通用"特性集,尽管不需要任何抽象实例.再次,来自纯虚拟定义函数:

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 */ }
Run Code Online (Sandbox Code Playgroud)

  • @ AngelO'Sphere:这个问题是关于C++的,其中"抽象类"和"多态类"的含义分别由语言标准定义为"具有至少一个纯虚函数的类"和"具有至少一个纯虚函数的类"至少一个虚函数".这些词的其他含义在其他语境中可能有用,但在用于描述其他C++概念时只会造成混淆. (2认同)

NPE*_*NPE 11

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

是-如果有问题的功能是纯虚析构函数,它必须也可以通过基类中定义.