【发布时间】:2021-12-11 05:39:32
【问题描述】:
首先,我有抽象父类:
class Abstract_class {
virtual void Method1() {
std::cout<<"Method1 of abstract class!\n";
}
};
我也有一个子类
class Child1: public Abstract_class {
void Method1() override {
std::cout<<"Method1 of child1 class!\n";
}
};
class Child2: public Abstract_class {
void Method1() override {
std::cout<<"Method1 of child2 class!\n";
}
};
我的主要功能
int main(){
Abstract_class ** arr = new Abstract_class * [10];
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
Abstract_class * obj;
// pseudo random rules for fill array
if (i%2 == 0) {
arr[i] = new Child1();
}
else {
arr[i] = new Child2();
}
}
}
}
现在,假设我对这个数组执行一些操作,引用元素,并且我需要知道对象所在的位置,这样就不会出现我期望 Method1 像在 child1 中那样执行的情况,但我得到了 child2 方法的完全不同的实现。 当然,你总是可以在类中添加字段来标识一个对象,但是我想要一些符合 OOP 规则的优雅的东西
UPD1:
所以,我意识到这种处理多态对象的方式是错误的。但是假设我们有一个特定的比赛场地,上面有不同的继承对象(盒子,敌人,玩家),如果它们是不同的类型,它们怎么可能在同一个场地上。我如何与他们互动?
【问题讨论】:
-
多态性的关键点之一是函数使用多态类型不必必须知道它使用的是什么类型.有需要的代码可能是一个架构错误,并且违反了 LSP。
-
@Eljay 好的,我只是想不出更好的方法来存储具有不同元素的矩阵。假设我们有一个特定的运动场,上面有不同的继承对象(盒子、敌人、玩家),如果它们是不同的类型,他们怎么能在同一个场上呢?
-
我提供的答案here 在由不同类型组成的表中利用了 CRTP 和 静态多态。 (答案有赞成票和反对票,所以它不是一个得到广泛认可的答案。可能回答离问题太远了,尽管 OP 很欣赏这个答案。)也许这种技术对你的程序。
标签: c++ class oop inheritance