2010-12-06 3 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 = does not?

ответ

8

То, что вы видите, не является проблемой сокрытия. Вы не создали оператор присваивания для назначения B в B, поэтому компилятор создал его для вас. Тот, который создается компилятором, вызывает оператор присваивания A.

Поэтому, если у вас есть вопрос «Вопрос: почему B :: foo скрывает A :: foo, но B :: operator = does not?» следует читать: «Как оператор = отличается от обычной функции», разница заключается в том, что компилятор предоставит вам один, если вы не напишете свой собственный.

+0

Хорошо, как я понимаю, компилятор генерирует следующий код для B: B & оператора = (B & Const б) { A :: = оператор (б); возвращение * это; } Но если у нас есть виртуальный «A :: operator =», тогда вызывается «B :: operator =», потому что он переопределяет «A :: operator =». Но это не так. – drinian 2010-12-06 14:00:58

Смежные вопросы