本地抽象类的纯虚拟析构函数
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();
}
但是现在考虑第二个代码,我们需要在函数中本地声明我们的类为:
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();
}
代码剂量不编译! 知道吗? 有什么方法可以重新定义本地声明的基类的纯虚拟析构函数吗?
cppreference 说
类声明可以出现在函数主体中(...),在这种情况下,它定义一个本地类
。
局部类的成员函数必须完全在类体内定义
没有办法做你想做的事。但是,还要考虑一下:为什么你通常要为纯虚拟析构函数给出一个主体定义?典型的答案是,你想使类抽象,但没有其他方法可以成为纯虚拟的。出现这种情况的情况通常是您无法直接控制类的使用或继承。但是对于在函数内部本地定义的类来说,这永远不会发生:根据定义,它的任何使用都必须在完全相同的函数体内,让作者完全控制用法。因此,例如,你可以确保你的类总是继承自而不是按原样使用(即强制类是抽象的目的),只需在本地函数的直接控制的上下文中自己观察这个规则。
在C++中,你不能有嵌套函数。通过做
foo(){
//...
A::~A{} // you define a nested function which is not allowed
//...
}
IMO,对于带有函数的嵌套类,我们必须在类块中定义所有非纯函数。
如果你想让你的类 A 是抽象类,你可以将 A::foo() 声明为纯虚拟函数或一些新的空函数。在任何情况下,您都需要在类块外部或内部定义虚拟 dtor,因为不这样做会导致链接错误。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数