[英]C++ — why should we define the pure virtual destructor outside the class definition?
[英]Why isn't there an implicit defaulted definition for pure virtual destructor?
我知道如果该类应该是抽象的,但不包含任何使用定义的方法,则可以通过使析构函数纯虚拟来实现这一点。
class B{
public:
virtual ~B() = 0;
}
据我了解,下面示例中的对象不应该被实例化。
#include <iostream>
class A{
public:
A(){std::cout<<"A::A()"<<std::endl;}
virtual ~A() = 0;
};
class B : public A{
public:
B(){std::cout<<"B::B()"<<std::endl;}
};
int main(){
B b;
}
我知道纯虚函数也可以有定义,并且在上面的情况下,它应该为B
析构函数定义,但对我来说有些模糊。 有什么特别的理由不让纯虚拟析构函数的定义在 C++ 标准中被隐式默认,因为对我来说这很有意义。
如果一个函数被声明为纯虚函数,那么这意味着两件事:
无法实例化具有此类声明的类。
任何派生类都必须为方法提供定义,否则它们也不能被实例化。
但是,#2 仅在您不为该纯虚函数声明提供定义时才会发生。 如果您确实定义了纯虚函数,则派生类不需要专门覆盖这些方法。
因此,如果始终存在纯虚拟析构函数的默认定义,则不可能强制用户为派生类声明析构函数。
在非常罕见的情况下,您有一个打算用作虚拟类型的类,但没有实际的接口(当您没有接口时,我看不出如何坚持 Liskov 替换原则),因此不应实例化,并且您还希望用户不必显式定义析构函数,您可以这样做:
#include <iostream>
class A{
public:
A(){std::cout<<"A::A()"<<std::endl;}
virtual ~A() = 0;
};
A::~A() = default; //Yes, this is legal.
class B : public A{
public:
B(){std::cout<<"B::B()"<<std::endl;}
};
int main(){
B b;
}
然而,我非常怀疑这种情况在现实中出现的频率是否足够大。 在大多数用于虚拟接口的真实类型中,它们具有超出“可以销毁”的实际虚拟接口。 它们需要virtual
析构函数,但它们也有其他可以是纯的虚函数。 因此,它们的析构函数不需要是纯的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.