我正在研究一个系统,其中一个类有一个私有成员,它是一个基类指针。指针可以指向继承的类对象。我希望参数化和复制构造函数能够获取基类类型的指针,并在不删除继承类型的情况下对其进行深度复制。下面是我为演示这个问题而编写的一些代码;我希望c2和c3调用B.print而不是A.print,但无法确定如何调用。
class A { protected: double a; double b; public: A() { a = 0.0; b = 0.0; } A(double a, double b) { this->a = a; this->b = b; } A(const A& copy) { a = copy.a; b = copy.b; } virtual void print() { std::cout << "print A" << std::endl; std::cout << "a: " << a << ", b: " << b << std::endl; } }; class B : public A { private: double c; public: B() { c = 0.0; } B(double a, double b, double c) : A(a, b) { this->c = c; } B(const B& copy) : A(copy) { c = copy.c; } virtual void print() { std::cout << "print B" << std::endl; std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl; } }; class C { private: A* a; public: C() { a = nullptr; } C(A* a) { this->a = new A(*a); } C(const C& copy) { a = nullptr; if (copy.a != nullptr) a = new A(*copy.a); } ~C() { delete a; a = nullptr; } void print() { if (a != nullptr) a->print(); } }; int main() { A* a = new A(3.5, 4.5); A* b = new B(3.5, 4.5, 5.5); C c1(a), c2(b), c3(c2); delete a, b; c1.print(); c2.print(); c3.print(); }
我尝试过包含一个可用类型的枚举并分别存储该值,但该程序是不可扩展的,因为它需要为每个添加的继承类型更改开关和枚举。