存储在一个通用容器中的派生对象.如何避免铸造

Derived Objects stored in one common container. How to avoid casting

本文关键字:派生 对象 何避免 一个 存储      更新时间:2023-10-16

嘿,亲爱的,我正在做这件事。也许这不好。

class Base
{
public:
Base() {}
virtual ~Base() {}
//some data
int a;
};
class Derived : public Base
{
public:
Derived() {}
~Derived() {}
//some extra data not in base
int b;
};
int main()
{
std::map<int, Base*> dervivedObjs;
Derived* derived = new Derived;
dervivedObjs.emplace(0, derived);
Derived* derivedPtr = reinterpret_cast<Derived*>(dervivedObjs.at(0));
return 0;
}

每次我需要访问派生类上的一些数据时,如何避免强制转换?

还是有最具表演性的方式?

每次需要访问派生类上的一些数据时,如何避免强制转换?

通过提供适当的接口:

class Base
{
public:
Base() {}
virtual ~Base() {}
//some data
int a;
virtual int get_b() = 0;
};

现在Derived可以覆盖get_b以提供对其成员b的访问。

PS

更确切地说,Derived和从Base继承的所有其他类必须为get_b提供定义,因为get_b是纯虚拟的。

如果从Base派生的某些类不能做到这一点,您可以考虑在Base中使get_b非抽象。。。长话短说:不要。

想要铸造几乎总是错误设计的标志。你现在正在努力的是对抗你的设计。与其选角,不如退一步考虑std::map<int, Base*>是否是您真正想要的。这种数据结构的草率翻译是:"我想要一个容器,它的元素具有Base中定义的接口,而不是我不关心对象的动态类型。">

如果必须将Base*强制转换为Derived*,请使用dynamic_castreinterpret_cast的允许使用次数非常有限,并不意味着用于沿类层次结构的强制转换。

TL;DR

每次我需要访问派生类上的一些数据时,如何避免强制转换?

不要这么做。

在以下情况下,使用Base指针存储指向派生类的指针很有用:

1-您有许多从派生自Base的不同类实例化的对象,并希望将它们存储在一个容器中2-你想对那些应该在基类中声明为虚拟函数的对象执行常见任务

那么就不需要强制转换到派生类