我目前正在編寫一個複雜的類,並在其中我基本上需要複製派生類的列表。簡化版本,如下所示: 我有一個基類從中我獲得其他的幾類: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類的指針列表的列表:
這些對象,然後我想在同一個班(順序相同)第二列表複製,但它可能有不同的值。
for (int i = 0; i < (int)listA.size(); i++)
{
(*listA[i]) = (*listB[i]);
}
但是C++無法做到這一點。由於列表的類型是Base *,因此dereferencing會創建一個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=
可能的重複[爲什麼派生類不使用基類操作符=(賦值操作符)?](http://stackoverflow.com/questions/10838211/why-doesnt-a-derived-class-use -base-class-operator-assignment-operator?rq = 1) –
將'A'分配給'B'或反之亦然是什麼意思? – aschepler