这是我能找到的最接近可能重复的东西。然而,答案仍然给我留下了疑问。
这是一个代码示例:
class A {
A() {}
virtual void print() = 0;
}
class B : public A {
B() {}
void print() { printf("B"); }
}
class C : public A {
C() {}
void print() { printf("C"); }
}
int main() {
A** n;
n = new A*[4];
n[0] = new B;
n[1] = new C;
n[2] = new B;
n[3] = new C;
for(int i = 0; i < 4; i++)
n[i]->print();
printf("\n");
delete n[0];
delete n[1];
delete n[2];
delete n[3];
delete [] n;
}
使用这段代码,您将获得“BCBC”。有没有办法在不分配新对象的情况下更改派生类类型?就像是:
n[2] = (C*)n[2];
因此,当您打印出数组时,您现在会得到“BCCC”。我在链接的帖子中读到,必须这样做是设计不佳的证据。如果是这样的话,能解释一下吗?对我来说,这似乎是面向对象设计的一个正常且频繁的用例。假设所有属性都在基类中定义。类的唯一区别在于方法的实现。
如果 C++ 不支持在运行时更改这样的对象类型,那么获得类似结果的公认方法是什么?