【问题标题】: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并直接提供代码。

标签: c++ inheritance virtual-functions


【解决方案1】:

cppreference

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

...

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-04-20
        • 2011-03-21
        • 2019-12-08
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-06-19
        • 2013-01-15
        相关资源
        最近更新 更多