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

5

考虑以下代码:

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

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


2
本地类的所有方法定义都应内联在类内。 - Jarod42
由于您处于本地作用域(因此您控制依赖项),因此可以摆脱“= 0”并直接提供代码。 - Jarod42
3个回答

6

cppreference 上说:

类声明可以出现在(...)函数体内,此时它定义了一个局部类。

...

局部类的成员函数必须完全在类体内定义。


4
没有办法实现您想要的功能。但是,请考虑以下内容:为什么通常希望为纯虚析构函数提供一个函数体定义呢?典型的答案是,您希望使类成为抽象类,但没有其他可以成为纯虚函数的方法。出现这种情况的场景通常是在您对类的使用或继承没有直接控制权的情况下。但是,在函数内部定义的类永远不可能发生这种情况:根据定义,它的使用必须完全在相同的函数体内进行,从而使作者对其使用具有完全控制权。因此,例如,您可以通过在直接受控的本地函数上下文中遵循此规则来确保始终从该类继承而不是直接使用它(即强制将类变为抽象类)。

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

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

在嵌套类中定义函数时,我们必须在类块中定义所有非纯虚函数。

如果您希望将类A定义为抽象类,则可以将A :: foo()声明为纯虚函数或某些新的空函数。无论哪种情况,您都需要在类块内或外定义虚拟dtor,否则将导致链接错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接