考虑以下代码:
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 :(得分:6)
类声明可以出现(...)并且在函数体内,在这种情况下它定义了一个本地类
...
本地类的成员函数必须完全在类主体
中定义
答案 1 :(得分:4)
没有办法做你想做的事。但是,请考虑一下:为什么您通常想要为纯虚拟析构函数提供一个正文定义?典型的答案是你想让类抽象,但没有其他方法可以做成纯虚拟。出现这种情况的情况通常是您无法直接控制类的使用或继承。但是对于在函数内部本地定义的类,这种情况永远不会发生:根据定义,它的任何使用必须在完全相同的函数体内,从而使作者完全控制使用。因此,例如,您可以确保您的类始终是继承而不是按原样使用(即强制类是抽象的目的),只需在本地函数的直接控制上下文中自己观察此规则即可。
答案 2 :(得分:1)
在C ++中,您不能拥有嵌套函数。通过做
#button
IMO,对于带有函数的嵌套类,我们必须在类块中定义所有非纯函数。
如果希望类A是抽象类,可以将A :: foo()声明为纯虚函数或一些新的空函数。在任何情况下,您都需要在类块外部或内部定义虚拟dtor,因为不这样做会导致链接错误。