2015-06-24 38 views
-1

幫助?我真的不知道這裏發生了什麼? 爲什麼在分配的第3行中,當B分配給B時,它會調用A的operator =?C++ operator =怪異behviour

class A{ 
public: 
    A& operator=(const A&){cout << "A assignment" << endl;return *this;} 
}; 

class B:public A{ 
public: 
    A& operator=(const A&){cout << "B assignment" << endl;return *this;} 
}; 

int main() { 
    A a; 
    B b; 
    B b2;  
    a=b; // output: A assignment 
    b=a; // output: B assignment 
    b=b2; // output: A assignment WHY?? 
    return 0; 
} 
+0

[不編譯](http://ideone.com/TWtPTP) –

+0

這樣編譯? –

+0

@jafar查看我之前的評論。 –

回答

1

你在B定義的賦值運算符,但也有編譯器生成的另一個隱含的拷貝賦值運算符:

B& B::operator=(B const&); 

這比一個需要A const&所以它選擇了一個更好的匹配在分配b = b2(因爲b2B它不需要從一個A一個派生到基地轉換)。隱含的拷貝賦值運算符調用你寫的基類的拷貝賦值運算符:

B& B::operator=(B const& b) { 
    A::operator=(b); 
    return *this; 
} 

這就是爲什麼它看起來像A::operator=(A const&)正在被分配選擇。

+0

看來你是對的,除非我明確地重載B&B :: operator =(B const&b)我的自我,它會做你說的那樣。 –

2

B類中它仍然有一個編譯器生成的賦值運算符(它被重載)。與構造函數的工作方式不同,定義一個或多個賦值運算符重載不會阻止編譯器在缺少賦值運算符時生成複製賦值運算符。編譯器生成一個調用A::operator=。對於B類型的參數來說,這是更好的匹配。

+0

它是如何更好地匹配tho?他們完全一樣,不是嗎? –

+0

@MichaelPapkov:一個重載(用戶定義)需要一個'A const&',另一個(編譯器生成)則需要一個'B const&'。 –