【发布时间】:2021-01-20 00:02:19
【问题描述】:
我目前在访问位于基向量中的子对象的成员时遇到问题,我知道这是一个对象切片问题,我正在尝试使用动态转换,但我是初学者,并且不确定语法或如何使用它,任何帮助将不胜感激 伪代码:
class Base {}
Class Derived : public base {
bool A
}
std::vector<Base*> items;
Item* i = new Derived(constructor);
items.push_back(i);
// items[0]->A isnt accessible due to object slicing
【问题讨论】:
-
使用虚拟getter和setter函数访问
A。 -
无关:这不是因为对象切片。您仍然有一个
Derived指针。对象切片是将派生类存储为基类,而不仅仅是由基类引用。 -
C++ 中
class的默认可见性是私有的。这不是切片问题。这是visibility 问题。 -
它不是像@user4581301 那样切片,但也不仅仅是因为可见性。即使
A是Derived的公共成员,您仍然必须将Base*指针动态转换为Derived*指针,然后才能通过它到达A。 -
当你想把它当作
Derived对待时,为什么你把它存储为Base类型呢?特别是没有任何检查它是否真的是Derived类型。对我来说,这听起来像是糟糕的设计。但如果需要,请使用dynamic cast conversion。