gpt4 book ai didi

c++ - 没有虚拟析构函数的继承

转载 作者:太空狗 更新时间:2023-10-29 20:58:18 25 4
gpt4 key购买 nike

我在一个项目中使用了两个类。一个类 Callback 负责保存来自回调的信息。另一个类 UserInfo 是向用户公开的信息。基本上,UserInfo 应该是一个非常薄的包装器,它读取 Callback 数据并将其提供给用户,同时还提供一些额外的东西。

struct Callback {
int i;
float f;
};

struct UserInfo {
int i;
float f;

std::string thekicker;
void print();
UserInfo& operator=(const Callback&);
};

问题是向 Callback 添加成员需要对 UserInfo 进行相同的更改,以及更新 operator= 和类似的依赖成员函数。为了让它们自动同步,我想这样做:

struct Callback {
int i;
float f;
};

struct UserInfo : Callback{
std::string thekicker;
void print();
UserInfo& operator=(const Callback&);
};

现在 UserInfo 保证拥有与 Callback 相同的所有数据成员。事实上,踢球者是数据成员thekickerCallback 中没有声明虚拟析构函数,我相信其他编码人员希望它保持这种状态(他们强烈反对虚拟析构函数的性能损失)。但是,如果 UserInfo 类型通过 Callback* 销毁,thekicker 将被泄露。应该注意的是,UserInfo 并非旨在通过 Callback* 接口(interface)使用,因此这些类首先是分开的。另一方面,为了修改一个结构而不得不以相同的方式更改三段或更多代码让人感觉不雅且容易出错。

问题:有没有办法让UserInfo公开继承Callback(用户必须能够访问所有相同的信息) 但不允许将 Callback 引用分配给 UserInfo 是因为缺少虚拟析构函数吗?我怀疑这是不可能的,因为它首先是继承的基本目的。我的第二个问题,有没有办法通过其他方法使这两个类彼此同步?我想让 Callback 成为 UserInfo 的成员而不是父类,但我希望数据成员直接用 user.i 读取user.call.i 的。

我想我问的是不可能的事情,但我一直对 stackoverflow 答案的魔力感到惊讶,所以我想我只是问问是否真的有补救办法。

最佳答案

您始终可以通过在基类中保护析构函数来强制执行您提到的“无法通过基类指针删除”约束(在某种程度上):

// Not deletable unless a derived class or friend is calling the dtor.
struct Callback {
int i;
float f;
protected:
~Callback() {}
};

// can delete objects of this type:
struct SimpleCallback : public Callback {};


struct UserInfo : public Callback {
std::string thekicker;
// ...
};

正如其他人提到的,您可以删除赋值运算符。对于 c++11 之前的版本,只需将该函数的未实现原型(prototype)设为私有(private)即可:

private:
UserInfo& operator=(const Callback&);

关于c++ - 没有虚拟析构函数的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com