繁体   English   中英

为什么纯虚拟析构函数没有隐式默认定义?

[英]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++ 标准中被隐式默认,因为对我来说这很有意义。

如果一个函数被声明为纯虚函数,那么这意味着两件事:

  1. 无法实例化具有此类声明的类。

  2. 任何派生类都必须为方法提供定义,否则它们也不能被实例化。

但是,#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM