Разрешение оператора присваивания C ++ - PullRequest
1 голос
/ 06 декабря 2010

Рассмотрим следующий код:

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 = нет?

1 Ответ

8 голосов
/ 06 декабря 2010

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

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

...