局部抽象类的纯虚析构函数
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++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解