所以我有一个带有2个派生类的抽象基础,以及一个带有A** arr;
的容器;现在,我想重载赋值运算符,但执行arr[i] = new A(other.arr[i]);
显然不起作用。我该如何解决这个问题?我是否需要使用dynamic_cast
或其他内容,还是有更“优雅”的解决方案?
class A {
private:
int someMember;
public:
virtual void someMethod() = 0;
A();
~A();
};
class B : public A
{
private:
int someOtherMember;
public:
virtual void someMethod(){}
B();
~B();
};
class C : public A
{
private:
int anotherMember;
public:
virtual void someMethod(){
C();
~C();
};
class Container
{
private:
A** arr;
int arrSize;
public:
Container();
~Container();
//How do I implement this?
Container& operator=(Container& other);
};
Container & Container::operator=(Container & other)
{
//Clear current array
for (int i = 0; i < arrSize; i++)
{
delete arr[i];
}
delete[] arr;
//create new array
this->arr = new A*[other.arrSize];
//fill new array
for (int i = 0; i < other.arrSize; i++)
{
//doesnt work, since A is abstract base class
arr[i] = new A(other.arr[i]);
}
}
不允许使用向量,因为这是学校的作业(老师明确表示没有std::vector
)
答案 0 :(得分:1)
向clone
添加A
虚函数,该函数返回具体对象的副本A*
。在Container:: operator=
内调用此方法以多态方式复制对象。
答案 1 :(得分:1)
嗯,RTTI不是我在生产代码中使用的东西,但在这种情况下它应该没问题。你可以这样做:
A* ref = other.arr[i];
if(typeid(ref) == typeid(B*))
arr[i] = new B(*dynamic_cast<B*>(ref));
else if(typeid(ref) == typeid(C*))
arr[i] = new C(*dynamic_cast<C*>(ref));
else
//handle error or change else if to else
当然,这要求B
和C
定义了复制构造函数,并从A
实现了纯虚函数。你也应该将析构函数设为虚拟。