可以删除抽象类而不是子类吗?
Is it ok to delete an abstract class instead of a child?
是否可以删除抽象类而不是子类?所有的分配会因此被重新分配吗?
考虑以下情况作为例子,但请不要将你的答案限制在一种情况:
struct A {
virtual void fun() = 0;
};
struct B : public A {
void fun() { /* actually doing something here. */ }
};
struct C {
A *a;
void OneTask() {
// (...)
a = new B();
}
void AnotherTask() { /* using fun() in some way. */ }
~C() { delete a; }
};
这个想法是有OneTask()的多个可能的结果,导致一个指针的赋值,从a继承不同的类,B只是一个例子;然后在AnotherTask()和c类的其他方法中合理地使用这些结果。
必须在基类中使用虚析构函数,否则派生类不会完全销毁。
struct A {
virtual void fun() = 0;
virtual ~A()
{
}
};
是的,对于delete a
来说,不知道a
实际指向的派生类型是什么是完全可以的。
正如shivakumar所指出的,如果不将基类的析构函数设为虚函数,那么删除派生类最终不会调用基类的析构函数。在您的简单示例中,这不是问题,但在实际生活中,您应该始终将析构函数设置为虚函数。
如果A有虚析构函数,则A和B的析构函数都被成功调用(首先是B,然后是A),
如果不将A的构造函数声明为虚函数,则在删除时只调用A的析构函数,并且B的扩展数据可能会泄漏。
struct A {
virtual void fun() = 0;
virtual ~A();
};
struct B : public A {
void fun() { /* actually doing something here. */ }
~B();
};
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 是否可以子类 std::unique_ptr 透明地应用自定义删除器
- 删除已创建的Qt元素和子类
- 我可以显示根据需要创建的对象(QLabel 的子类)吗?(我遇到的问题是删除它)
- 父类析构函数删除具有外部启动元素的子类
- std::istream子类:删除析构函数中的streambuf
- 我无法理解为什么从子类中删除变量后输出会发生变化
- 可以删除抽象类而不是子类吗?
- 删除指向子类的指针时不释放内存