局部抽象的纯虚拟析构函数 class
Pure virtual destructor of a local abstract class
考虑以下代码:
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();
}
它工作得很好。但现在考虑第二个代码,我们需要在函数内部局部声明我们的 classes 为:
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();
}
代码无法编译!任何的想法?有什么方法可以重新定义在本地声明的基 class 的纯虚拟析构函数?
A class declaration can appear (...) and inside the body of a function, in which case it defines a local class
...
Member functions of a local class have to be defined entirely inside the class body
没有办法如你所愿。但是,还要考虑一下:为什么通常要为纯虚析构函数提供主体定义?典型的答案是您想使 class 成为抽象的,但没有其他方法可以成为纯虚拟的。出现这种情况的情况通常是您无法直接控制 class 的使用或继承。但是对于在函数内部本地定义的 class 来说,这永远不会发生:根据定义,对它的任何使用都必须在完全相同的函数体内,让作者可以完全控制使用。因此,例如,您可以确保您的 class 始终继承自 as-is 而不是使用 as-is (即强制 class 成为抽象的目的),只需在 directly-controlled 本地函数的上下文。
在 C++ 中不能有嵌套函数。通过
foo(){
//...
A::~A{} // you define a nested function which is not allowed
//...
}
IMO,对于带有函数的嵌套 class,我们必须在 class 块中定义所有 non-pure 函数。
如果您希望 class A 是抽象的 class,您可以将 A::foo() 声明为纯虚函数或一些新的空函数。在任何情况下,您都需要在 class 块的外部或内部定义虚拟 dtor,因为不这样做会导致链接错误。
考虑以下代码:
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();
}
它工作得很好。但现在考虑第二个代码,我们需要在函数内部局部声明我们的 classes 为:
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();
}
代码无法编译!任何的想法?有什么方法可以重新定义在本地声明的基 class 的纯虚拟析构函数?
A class declaration can appear (...) and inside the body of a function, in which case it defines a local class
...
Member functions of a local class have to be defined entirely inside the class body
没有办法如你所愿。但是,还要考虑一下:为什么通常要为纯虚析构函数提供主体定义?典型的答案是您想使 class 成为抽象的,但没有其他方法可以成为纯虚拟的。出现这种情况的情况通常是您无法直接控制 class 的使用或继承。但是对于在函数内部本地定义的 class 来说,这永远不会发生:根据定义,对它的任何使用都必须在完全相同的函数体内,让作者可以完全控制使用。因此,例如,您可以确保您的 class 始终继承自 as-is 而不是使用 as-is (即强制 class 成为抽象的目的),只需在 directly-controlled 本地函数的上下文。
在 C++ 中不能有嵌套函数。通过
foo(){
//...
A::~A{} // you define a nested function which is not allowed
//...
}
IMO,对于带有函数的嵌套 class,我们必须在 class 块中定义所有 non-pure 函数。
如果您希望 class A 是抽象的 class,您可以将 A::foo() 声明为纯虚函数或一些新的空函数。在任何情况下,您都需要在 class 块的外部或内部定义虚拟 dtor,因为不这样做会导致链接错误。