提供纯虚函数的定义

St.*_*rio 1 c++ virtual

我是一名 Java 程序员,对提供纯虚拟函数定义的事实感到困惑。在 Java 中,我习惯于将抽象方法视为我们将在基类中提供定义的方法。但是下面的代码是完全有效的:

#include <iostream>

struct A
{
   virtual ~A() = 0;
};

A::~A(){ std::cout << "~A()" << std::endl; }

struct B : A
{
    ~B(){ std::cout << "~B()" << std::endl; }
};

A *a = new B;


int main()
{
    delete a;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们尝试做这样的事情:

#include <iostream>

struct A
{
   virtual ~A() = 0;
   virtual void foo() = 0;
};

void A::foo(){ }
A::~A(){ std::cout << "~A()" << std::endl; }

struct B : A
{
    ~B(){ std::cout << "~B()" << std::endl; }
};

A *a = new B;


int main()
{
    delete a;
}
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨没有为纯虚函数提供定义。为什么我们可以在命名空间范围内定义纯虚拟析构函数,而对于通常的成员函数却不能这样做。

这与其说是规则,不如说是例外?

Bri*_*ian 5

您可以定义任何纯虚成员函数。但是,即使您定义了A::foo,它仍然是纯的,因此AB仍然是抽象类,可能不会被实例化。这将是您的编译器可能发出的任何错误的原因。