我是一名 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)
编译器会抱怨没有为纯虚函数提供定义。为什么我们可以在命名空间范围内定义纯虚拟析构函数,而对于通常的成员函数却不能这样做。
这与其说是规则,不如说是例外?
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |