我有點迷失在C++運營商。我想執行的賦值操作符的兩個不同的類,即這樣一個可以指定一個彼此:爲什麼我不能有一個純粹的虛擬賦值操作符?
class A {
public:
virtual A &operator =(const A &a) = 0;
};
class B : public A {
public:
virtual A &operator =(const A &a) override {
std::cout << "B" << std::endl;
return *this;
}
};
class C : public A {
public:
virtual A &operator =(const A &a) override {
std::cout << "C" << std::endl;
return *this;
}
};
int main(int argc, char *argv[])
{
B b;
C c;
b = c;
// leads to a linker error: undefined reference to `A::operator=(A const&)'
//B b2;
//b = b2;
}
的第一項任務,似乎做的工作,「B」之稱。類似地,對於「c = b」,調用「C」。但是,當我取消註釋第二部分時,我收到鏈接器錯誤。如果我將A的運營商定義爲:
virtual A &operator =(const A &a) {
std::cout << "A" << std::endl;
return *this;
}
我得到「B」,「A」。咦?有人可以解釋爲什麼當分配兩個B時需要「A」,但是當B不是時B?
你認識到,編譯器也爲B和C的一個默認的拷貝構造函數,以及默認NON VIRTUAL B ::運算符=(常數B&)和C ::運算(常量C&)操作符....創建虛擬(甚至非虛擬)賦值操作符從基到派生是要求麻煩的。 –
這不是問題,但是你真的需要'std :: endl'做的額外的東西嗎? ''\ n''結束一行。 –