在基类本身中定义"pure"虚函数有什么意义吗?
Does it make any sense to define "pure" virtual functions in the base class itself?
在基类中定义公共虚函数的好处是,我们不必在派生类中重新定义它们。
即使在基类中定义纯虚函数,也必须在派生类中定义它们。#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等语言所称的接口。它只是描述了可用的函数,没有其他内容。
在没有合理实现纯虚函数时可以在基类中使用。在这种情况下,纯虚函数在派生类中实现。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 什么时候调用析构函数
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 是什么让放置新调用对象的构造函数?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 在C 中,对2D数组的增量是什么?函数断言(0)做什么?
- 我应该使用什么函数签名来返回对可能不存在的对象的引用
- 一个类的构造函数,为另一个类进行强制转换.将调用什么函数
- 在 opencv for c 中,什么函数与 Mat::convertTo 和 cvtColor() 完全相同
- 当按下Alt-Enter键时调用什么函数
- C库导出什么函数?
- 使用什么函数来选择文本
- c++在空类中编写和调用什么函数?
- 在共享库的构造函数(_init部分)中,如何知道什么函数被中断了?
- 我可以用什么函数来获取按钮的把手