显然,不允许使用内联定义。
所以,我想知道使用二进制作用域解析运算符在类定义之外定义纯虚函数的做法有用的情况?
我能想到的一个场景是假设所有派生类在纯虚函数定义中都有一些共同的代码/功能,并且常见的功能可以包含在纯虚函数本身的基类定义和基类版本中可以在派生类中调用纯虚函数'纯虚函数的定义。 (不确定语法是否有效。)
答案 0 :(得分:1)
实际上,当您想要调用基类中定义的常用功能时,纯虚拟成员函数。
(不确定语法是否有效)。
它的工作原理如下:
#include <iostream>
#include <memory>
struct Foo
{
virtual void f() = 0;
virtual ~Foo() = default;
};
void Foo::f()
{
std::cout << "common functionality" << std::endl;
}
struct Bar: Foo
{
void f() override
{
Foo::f(); // call the base pure virtual implementation, common functionality
std::cout << "derived functionality" << std::endl;
}
};
int main()
{
std::unique_ptr<Foo> upFoo{std::make_unique<Bar>()};
upFoo->f();
}
另见Scott Meyers的第34项&#39; Effective C ++ ,可以对此主题进行非常详细的讨论。
答案 1 :(得分:0)
一个明显的例子是你有一个纯虚拟析构函数。析构函数虽然是纯粹的,但仍会在派生类的对象被销毁时调用。因此,析构函数使用起来并且需要定义。在大多数情况下,您只需要显式默认它。它仍将执行析构函数的常规任务,调用非静态成员的析构函数和更多基类。