我目前正在编写一个复杂的类,在其中我基本上需要复制一组派生类。简化版如下所示: 我有一个基类,从中我派生出几个其他类:
class Base
{
public:
virtual void test(void)
{
cout << "Base" << endl;
}
Base(vector<Base*> *pointer)
{
pointer->push_back(this);
}
virtual Base& operator=(const Base& rhs)
{
cout << "Base=" << endl;
return *this;
}
};
class A : public Base
{
public:
void test(void)
{
cout << "A" << endl;
}
A(vector<Base*> *pointer) : Base(pointer) {}
A& operator=(const A& rhs)
{
cout << "A=" << endl;
return *this;
}
};
class B : public Base
{
public:
void test(void)
{
cout << "B" << endl;
}
B(vector<Base*> *pointer) : Base(pointer) {}
B& operator=(const B& rhs)
{
cout << "B=" << endl;
return *this;
}
};
然后我创建了一个对象列表,并将其保存在基类的指针列表中:
vector<Base*> listA;
new Base(&listA);
new A(&listA);
new B(&listA);
我希望将这些对象复制到一个与原列表相同顺序和类的第二个列表中,但该列表可能具有不同的值。
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]) = (*listB[i]);
}
然而,C++无法做到这一点。因为列表具有Base*类型,解引用会创建一个Base类型的对象。因此,赋值运算符=调用的是Base类的赋值运算符,而不是派生类中正确的赋值运算符。我该如何解决这个问题?
或者我该如何告诉C++使用正确的运算符?也许可以通过某种isinstanceof函数实现?
完整示例请参见:
int main()
{
vector<Base*> listA;
new Base(&listA);
new A(&listA);
new B(&listA);
vector<Base*> listB;
new Base(&listB);
new A(&listB);
new B(&listB);
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]).test();
}
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]) = (*listB[i]);
}
}
这将输出:
Base
A
B
Base=
Base=
Base=
A
赋值给B
或者反过来是什么意思? - undefined