【问题标题】:accessing a member of a child object when it is in a base vector [duplicate]访问位于基向量中的子对象的成员[重复]
【发布时间】: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 那样切片,但也不仅仅是因为可见性。即使ADerived 的公共成员,您仍然必须将Base* 指针动态转换为Derived* 指针,然后才能通过它到达A
  • 当你想把它当作Derived 对待时,为什么你把它存储为Base 类型呢?特别是没有任何检查它是否真的是Derived类型。对我来说,这听起来像是糟糕的设计。但如果需要,请使用dynamic cast conversion

标签: c++ class oop vector


【解决方案1】:

第一种技术是依赖虚函数:

class Base 
{
    public:
    virtual int doStuff();
}

Class Derived : public base 
{
    public:
    virtual int doStuff();
}

然后,items[0]-&gt;doStuff() 将调用派生版本。

第二个技巧是低调:

dynamic_cast<Derived*>(items[0]);

这将为您提供nullptr 或您的派生对象指针。问题是,您需要添加一个虚函数才能使其工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多