我在互联网上读到很少我们会定义该功能,即使它在类中被定义为纯虚拟,如下所示。
class abc
{
public:
virtual void func() = 0;
}
void abc::func()
{
cout << "in abc::func()";
}
我不明白这个的用途。在链接http://www.gotw.ca/gotw/031.htm上,提到我们可以将其用作纯虚析构函数。但我还不清楚。任何人都可以告诉我有什么用途。
答案 0 :(得分:4)
析构函数需要一个实现,即使它是纯虚拟的,因为析构函数是自动和非虚拟调用的(每个基类链上调)。
因此,如果你有一个纯粹的虚拟析构函数,你最好也定义它。
否则,您将无法销毁从该类派生的该类或类的任何对象:将在销毁中尝试析构函数调用,并且链接器将抱怨它无法找到定义。< / p>
通过一种从未修复的语法怪癖,定义不能在类定义中内联提供,但必须单独提供。
答案 1 :(得分:2)
实现的纯虚函数的另一个用途是强制子类显式请求默认行为。在Effective C ++ Item 34(释义(paracoding?))中给出了一个很好的例子:
class Airplane
{
public:
virtual void fly() = 0;
};
Airplane::fly()
{
//A default implementation
}
class ModelA : public Airplane
{
public:
virtual void fly() { Airplane::fly(); } //explicitly use the default
};
class ModelB : public Airplane
{
public:
virtual void fly() { Airplane::fly(); } //explicitly use the default
};
class ModelC : public Airplane
{
public:
virtual void fly() { //different implementation }
};
这样做的想法是让客户很难意外地继承他们想到的默认行为。更一般地说,这个习惯用法可以通过分解非本质上默认的虚拟方法的实现来避免代码重复。
答案 2 :(得分:0)
没有规则阻止您定义纯虚方法。这可以用来强制子类提供实现,但同时也让你有机会提供一个方便的实现(执行常见任务)。
E.g如果xyz
派生自abc
,它可以使用abc
函数定义:
struct xyz : public abc
{
virtual void func() override
{
abc::func(); // explicitely calling the implementation provided by abc
}
}