本地抽象类的纯虚拟析构函数

时间:2017-02-01 10:34:48

标签: c++ inheritance virtual-functions

考虑以下代码:

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();  
}

代码不能编译!任何的想法?是重新定义在本地声明的基类的纯虚析构函数的任何方法吗?

3 个答案:

答案 0 :(得分:6)

cppreference

  

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

     

...

     

本地类的成员函数必须完全在类主体

中定义

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

#button

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

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