如果只有一些派生的 class 是多态的,基 class 析构函数是否需要是虚拟的?
Does base class destructor need to be virtual if only some derived classes are polymorphic?
我遇到了与 类似的情况,我有 2 个 classes 共享一个 public 接口函数,所以我提取了该函数(manage_data_in_memory() 在示例中)输出到基 class 中,2 classes 继承自该基。但是,2 classes 在其他方面不相关,其中一个是多态的,而另一个不是。也不希望有人声明这个基 class 的对象,因为它的存在只是为了防止代码重复(有没有办法强制执行此操作?我知道纯虚函数可以防止对象被实例化,但是声明一个在派生 class 中什么都不做的虚拟纯虚拟似乎是糟糕的设计)。
在这种情况下,基础 class 析构函数是否需要是虚拟的?这将迫使另一个派生的 class 也有一个它不需要的虚拟析构函数。
谢谢
所以现在我的代码形式为
class base { // don't instantiate an object of this, is there a way to enforce this?
public:
void manage_data_in_memory();
protected:
data;
};
class derived : public base
{
public:
void sendData();
private:
virtual void sendDataHelper(); // override this in derived classes which need to send custom data in addition to the default data
};
class derived2 : public base
{
public:
void do_Z_On_data()
};
当且仅当派生 class 的实例将通过指向基对象的指针销毁时,基 class 的析构函数必须是虚拟的。如果在这种情况下析构函数不是虚拟的,那么程序的行为将是未定义的。示例:
struct Base {
// ...
};
struct Derived : Base {};
std::unique_ptr<Base> ptr = std::make_unique<Derived>();
// Base::~Base must be virtual
可以通过使用私有继承来防止 class 的用户这样做(至少是意外地)。如果析构函数不是虚拟的,那么继承应该是私有的,除非在需要标准布局的特殊情况下 class.
is this because private inheritance would make the destructor private
不,私有继承不会使析构函数私有。
which prevents anyone from declaring an object of Base?
不,声明一个 Base 对象不是问题。
私有继承防止从派生指针转换为派生class(和朋友)的成员函数之外的基指针。无法获取指向派生基址的指针 class 将阻止用户通过此类指针删除派生对象。
我遇到了与
在这种情况下,基础 class 析构函数是否需要是虚拟的?这将迫使另一个派生的 class 也有一个它不需要的虚拟析构函数。 谢谢
所以现在我的代码形式为
class base { // don't instantiate an object of this, is there a way to enforce this?
public:
void manage_data_in_memory();
protected:
data;
};
class derived : public base
{
public:
void sendData();
private:
virtual void sendDataHelper(); // override this in derived classes which need to send custom data in addition to the default data
};
class derived2 : public base
{
public:
void do_Z_On_data()
};
当且仅当派生 class 的实例将通过指向基对象的指针销毁时,基 class 的析构函数必须是虚拟的。如果在这种情况下析构函数不是虚拟的,那么程序的行为将是未定义的。示例:
struct Base {
// ...
};
struct Derived : Base {};
std::unique_ptr<Base> ptr = std::make_unique<Derived>();
// Base::~Base must be virtual
可以通过使用私有继承来防止 class 的用户这样做(至少是意外地)。如果析构函数不是虚拟的,那么继承应该是私有的,除非在需要标准布局的特殊情况下 class.
is this because private inheritance would make the destructor private
不,私有继承不会使析构函数私有。
which prevents anyone from declaring an object of Base?
不,声明一个 Base 对象不是问题。
私有继承防止从派生指针转换为派生class(和朋友)的成员函数之外的基指针。无法获取指向派生基址的指针 class 将阻止用户通过此类指针删除派生对象。