在基类中定义常用虚函数的好处是我们不必在派生类中重新定义它们。
即使我们在基类本身中定义纯虚函数,我们仍然必须在派生类中定义它们。
#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 ();
}
};
这可能看起来很有道理,但是在有益在基类本身中定义纯虚函数时是否存在任何情况?
答案 0 :(得分:14)
两件事:
首先,有一个通常被引用的边界线场景:假设你想要一个抽象基类,但是你有 no 虚拟函数。这意味着你没有制作纯虚拟的功能。现在有一种方法:因为你总是需要一个虚拟析构函数,你可以使它纯粹。但是你也需要一个实现,所以这是你的怜悯:
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 */ }
答案 1 :(得分:11)
在基类本身中定义纯虚函数是否有益?
是 - 如果有问题的函数是纯虚析构函数,则必须也由基类定义。
答案 2 :(得分:0)
只有纯虚函数的基类是像Java这样的语言所谓的接口。它简单地描述了可用的功能,没有别的。
答案 3 :(得分:0)
当没有合理实现纯虚拟函数可以在基类中时,这可能是有益的。在这种情况下,纯虚拟函数在派生类中实现。