gpt4 book ai didi

c++ - 在 C++ 中的派生类之间切换

转载 作者:行者123 更新时间:2023-11-28 07:40:26 24 4
gpt4 key购买 nike

这是我能找到的最接近 possible duplication 的东西.然而,这些答案仍然给我留下了疑问。

这是一个代码示例:

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++ 不支持在运行时像这样更改对象类型,那么获得类似结果的公认方法是什么?

最佳答案

最接近的是在 B 和 C 构造函数中实现,它们将接受 A(或 A*)作为输入并将任何需要的数据复制到新对象中。那么你应该得到这样的东西。

A* temp = n[2];  
n[2] = new C(A);
delete temp;

但更好的解决方案是创建一个类来保存数据,A* 指向一个实现不同数据操作方式的类。

关于c++ - 在 C++ 中的派生类之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931624/

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