В настоящее время я пишу сложный класс, и в нем мне в основном нужно скопировать список производных классов. Упрощенная версия следующим образом: У меня есть базовый класс, от которого я вывожу несколько других классов:Оператор присваивания C++ = перегрузка с производными классами
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;
}
};
Затем создать список объектов, которые я сохранить в в списке указателя класса Base :
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. Поэтому оператор присваивания = базового класса вызывается вместо правильного из производного класса. Как я могу это исправить?
Или как я могу сказать C++ использовать правильный оператор? Может быть, какая-то функция?
Для полного образца SEE:
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=
Возможный дубликат [Почему не производный класс использует оператор базового класса = (оператор присваивания)?] (Http://stackoverflow.com/questions/10838211/why-doesnt-a-derived-class-use оператор базового класса-оператора-присваивания? rq = 1) –
Что значит назначать 'A'' B' или наоборот? – aschepler