存储在一个通用容器中的派生对象.如何避免铸造
Derived Objects stored in one common container. How to avoid casting
嘿,亲爱的,我正在做这件事。也许这不好。
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_cast
。reinterpret_cast
的允许使用次数非常有限,并不意味着用于沿类层次结构的强制转换。
TL;DR
每次我需要访问派生类上的一些数据时,如何避免强制转换?
不要这么做。
在以下情况下,使用Base指针存储指向派生类的指针很有用:
1-您有许多从派生自Base的不同类实例化的对象,并希望将它们存储在一个容器中2-你想对那些应该在基类中声明为虚拟函数的对象执行常见任务
那么就不需要强制转换到派生类
相关文章:
- 为什么此派生对象无法访问基类的后递减方法?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何从 Gtk::窗口调用派生对象的析构函数
- 无法在派生对象上运行虚拟函数
- 尝试删除指向派生对象的基指针时断言错误
- 存储在一个通用容器中的派生对象.如何避免铸造
- 将派生对象分配给函数内的基类指针
- 替换派生对象向量中的对象"no matching function to call"
- 派生对象调用的 Base 方法的模板推导
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- C++ UBSAN 对派生对象产生误报
- 如何验证我是否正在使用C++中的基对象或派生对象
- C++ 构造函数和派生对象
- 将派生对象传递给模板
- 指向派生作品的基本指针,即使派生对象不存在