gpt4 book ai didi

c++ - 在派生类中处理派生对象集合的最佳方法是什么

转载 作者:太空狗 更新时间:2023-10-29 23:17:57 26 4
gpt4 key购买 nike

假设我有一个类“BaseA”,其中包含项目“ItemA”的集合。现在我想扩展“BaseA”以添加额外的功能,所以我从“BaseA”派生“DerivedA”。 “DerivedA”的一个特征是它必须处理更复杂的“DerivedITemA”项目而不是“ItemA”项目。

class BaseA {
protected:
vector<ItemA> x;
void m1(int i) { x.m1(i); }
};

class ItemA {
protected:
void m1(int i) { ... }
};

class DerivedItemA : public ItemA {
void m2(int i) { ... }
};

现在我想处理这样的事情:

class DerivedA : public BaseA {
vector<DerivedItemA> x;
void m2(int i) { x[i].m2(); }
};

即让我的派生类处理派生项。上述 x 的定义是不正确的,因为它与 BaseA 中的定义冲突。但我的想法是,我希望能够重用 BaseA 中处理 x 的所有方法,只要它们处理 ItemA 元素,并在 DerivedA 中使用扩展方法来处理 DerivedItemA 类型数据的额外复杂性

有什么建议吗?我目前的想法是为 x 定义一个新的数据类型(例如 VectorOfItemA)并从中派生 VectorOfDerivedItemA。我想知道是否有更简单/更好的解决方案。

谢谢

最佳答案

我相信您需要在 vector 中包含指针才能处理此问题。我对传递给 m1 和 m2 的值有点困惑,因为 i 似乎是一个索引,但这是我的猜测:

class BaseA {
protected:
vector<ItemA*> x;
void m1(int i) { x[i]->m1(i); }
};

class ItemA {
protected:
void m1(int i) { ... }
};

class DerivedItemA : public ItemA {
void m2(int i) { ... }
};

class DerivedA : public BaseA {
vector<DerivedItemA*> y; //don't shadow the base class vector!
void m2(int i) { y[i]->m2(i); }
};

然后,当您在 DerivedA 中添加一个项目时,将其添加到 x 和 y 中。这样 BaseA 就可以对 x 中的指针执行操作,而 DerivedA 可以对 y 中的指针执行操作。

编辑:您还需要提供用于添加项目的虚拟方法,否则您可能会将添加到 BaseA.x 的内容添加到 BaseA.x 而未添加到 DerivedA.y。

关于c++ - 在派生类中处理派生对象集合的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839953/

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