|
抽象类中的纯虚函数可以定义或具有实现。 只能使用完全限定的语法调用此类函数:
abstract-class-name::function-name()
在设计基类包含纯虚析构函数的类层次结构时,定义的纯虚函数非常有用。 这是因为对象销毁期间会始终调用基类析构函数。 请考虑以下示例:
// deriv_RestrictionsOnUsingAbstractClasses.cpp
// Declare an abstract base class with a pure virtual destructor.
// It's the simplest possible abstract class.
class base
{
public:
base() {}
// To define the virtual destructor outside the class:
virtual ~base() = 0;
// Microsoft-specific extension to define it inline:
// virtual ~base() = 0 {};
};
base::~base() {} // required if not using Microsoft extension
class derived : public base
{
public:
derived() {}
~derived() {}
};
int main()
{
derived aDerived; // destructor called when it goes out of scope
}
该示例演示了 Microsoft 编译器扩展如何支持向纯虚 ~base() 添加内联定义。 还可以使用 base::~base() {}.在类外定义它。
当对象 aDerived 超出范围时,将调用类 derived 的析构函数。 编译器生成代码以在 derived 析构函数之后隐式调用类 base 的析构函数。 纯虚函数 ~base 的空实现确保至少函数的某个实现存在。 如果没有,链接器将为隐式调用生成未解析的外部符号错误。
备注
在前面的示例中,纯虚函数 base::~base 是从 derived::~derived 隐式调用的。 还可使用完全限定的成员函数名称显式调用纯虚函数。 此类函数必须具有实现,否则调用会在链接时导致错误。
|
|