2010-12-06 67 views
1

考慮下面的代碼:C++賦值運算解決

struct A 
{ 
    void foo(const char *) { cout << __PRETTY_FUNCTION__ << endl; } 
    A & operator = (const A & ) { cout << __PRETTY_FUNCTION__ << endl; return * this; } 
}; 


struct B : public A 
{ 
    void foo(const char *) { cout << __PRETTY_FUNCTION__ << endl; } 
    A & operator = (const A & other) { cout << __PRETTY_FUNCTION__ << endl; return * this; } 
}; 

那麼當我們調用這個成員:

B b; 

b.foo("hehe"); 
b = b; 

會打印:

void B::foo(const char *) 
A& A::operator=(const A&) 

問:爲什麼B :: foo隱藏A :: foo,但B :: operator =不?

回答

8

你看到的並不是一個隱藏的問題。您沒有創建賦值運算符來將B分配給B,因此編譯器爲您創建了一個。編譯器創建的是A的呼叫賦值操作符。

因此,如果您的問題是「問題:爲什麼B :: foo隱藏A :: foo,但是B :: operator =不?」。應該被讀爲「操作符與普通函數不同」,不同的是編譯器會爲您提供一個,如果您不寫自己的。

+0

好的,據我所知,編譯器會生成對於B以下代碼: B&運算符=(常數B&B) { A ::運算符=(B); return * this; } 但是如果我們有虛擬的「A :: operator =」,那麼應該調用「B :: operator =」,因爲它覆蓋了「A :: operator =」。 但事實並非如此。 – drinian 2010-12-06 14:00:58