局部抽象类的纯虚析构函数

Posted

技术标签:

【中文标题】局部抽象类的纯虚析构函数【英文标题】:Pure virtual destructor of a local abstract class 【发布时间】:2017-02-01 10:34:47 【问题描述】:

考虑以下代码:

struct  A 
    virtual void foo() 
    virtual ~A() = 0;
;
struct B :public A

    virtual void foo() ;
;
A::~A() ; 
int main()

    A * a = new B();
    a->foo();

它工作得很好。但现在考虑第二个代码,我们需要在函数中本地声明我们的类:

void foo()

    struct  A 
        virtual void foo() 
        virtual ~A() = 0;
    ;
    struct B :public A
    
        virtual void foo() ;
    ;
    A::~A() ; //error C2352 : 'A::~A' : illegal call of non - static member function

    A * a = new B();
    a->foo();

int main()

    foo();  

代码无法编译!任何的想法?有什么方法可以重新定义本地声明的基类的纯虚析构函数?

【问题讨论】:

本地类的所有方法定义都应该内联在类中。 由于您在本地范围内(因此您可以控制依赖项),您可以摆脱= 0并直接提供代码。 【参考方案1】:

cppreference 说

类声明可以出现 (...) 并在函数体内,在这种情况下,它定义了一个局部类

...

本地类的成员函数必须完全在类体内定义

【讨论】:

【参考方案2】:

没有办法做你想做的事。但是,请考虑一下:为什么通常要为纯虚拟析构函数定义主体?典型的答案是你想让类抽象,但没有其他方法可以成为纯虚拟的。出现这种情况的情况通常是您无法直接控制类的使用或继承。但是对于在函数内本地定义的类,这永远不会发生:根据定义,任何对它的使用都必须在完全相同的函数体内,让作者可以完全控制使用。因此,例如,您可以确保您的类始终继承自而不是按原样使用(即强制类为抽象的目的),只需在本地函数的直接控制上下文中自己观察此规则即可。

【讨论】:

【参考方案3】:

在 C++ 中,不能有嵌套函数。通过做

foo()
//...
A::~A // you define a nested function which is not allowed
//...

IMO,对于带有函数的嵌套类,我们必须在类块中定义所有非纯函数。

如果你希望你的类 A 是抽象类,你可以将 A::foo() 声明为纯虚函数或一些新的空函数。在任何情况下,您都需要在类块外部或内部定义虚拟 dtor,否则会导致链接错误。

【讨论】:

以上是关于局部抽象类的纯虚析构函数的主要内容,如果未能解决你的问题,请参考以下文章

C++中的纯虚析构函数

关于纯虚析构函数的问题

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解

C++11接口纯虚析构函数

重读STL源码剖析:析构