use*_*182 5 c++ abstract-class destructor
在父类中仅使用纯虚拟析构函数创建抽象类是否是良好的实践(并且可能)?
这是一个样本
class AbstractBase {
public:
AbstractBase () {}
virtual ~AbstractBase () = 0;
};
class Derived : public AbstractBase {
public:
Derived() {}
virtual ~Derived() {}
};
Run Code Online (Sandbox Code Playgroud)
否则,如果衍生类的属性和构造函数都相同而另一个方法完全不同,我怎么能创建一个抽象类?
arm*_*ali 13
C++中的接口应该有一个实现的虚拟析构函数,什么都不做.接口中的所有其他方法都被定义为抽象(例如,在声明中添加= 0).这将确保您无法创建接口类的实例,但是一旦将接口指针指定给父对象,就可以删除对象.抱歉措辞不好,下面是一些代码:
class ISampleInterface
{
public:
virtual ~ISampleInterface() { };
virtual void Method1() = 0;
virtual void Method2() = 0;
}
class SampleClass : public ISampleInterface
{
public:
SampleClass() { };
void Method1() { };
void Method2() { };
}
int main()
{
ISampleInterface *pObject = (ISampleInterface*)new SampleClass();
delete pObject;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在基类中只有一个纯虚拟析构函数很少是一种好的做法,但它是可能的,在某些情况下甚至是可取的.
例如,如果依靠RTTI通过在指向基类的指针上尝试dynamic_cast来将消息分派给子类对象,则除了析构函数之外,基类中可能不需要任何方法.在这种情况下,将析构函数设为公共虚拟.
由于除了析构函数之外没有其他虚方法,因此必须将其设置为纯,以防止创建基类的对象.
在这里,为这个析构函数提供空体是至关重要的(即使它是"= 0"!)
struct AbstractBase {
virtual ~AbstractBase() = 0;
}
AbstractBase::~AbstractBase() {
}
Run Code Online (Sandbox Code Playgroud)
让body允许创建子类对象(假设子类定义析构函数并且不将其设置为纯粹).