Какую функцию он будет вызывать?

Вот код, я написал комментарии. Вопрос в том, что я не знаю, какая функция будет вызываться после функции unhide в классе Derive.

#include <conio.h>
 #include <iostream>
 #include <string>
 using namespace std;
 class Base
 {
 string strName;
 public:
 Base& operator=(const Base &b)
 {
 this->strName = b.strName;
 cout << "copy assignment" << endl;
 return *this;
 }
 Base& operator=(string& str)
 {
 this->strName = str;
 cout << "operator=(string& str)" << endl;
 return *this;
 }
 };
 class Derive : public Base
 {
 public:
 int num;
 using Base::operator =; // unhide Base::operator=();
 };
 int main(int argc, char *argv[])
 {
 Derive derive1;
 derive1.num = 1;
 Derive derive2;
 Base b1;
 derive1 = b1; // This will call Base& Base::operator=(const Base &b)
 //no problem
 string str("test");
 derive1 = str; // This will call Base& Base::operator=(string& str)
 // no problem
 derive2 = derive1; // What function will this statement call???
 // If it calls Base& Base::operator(const Base &b)
 // how could it be assigend to a class Derive?
 return 0;
 }
</string></iostream></conio.h>

Но результатом кода является: derive2.num равно 1!!!, это означает, что весь класс был скопирован после утверждения, почему это произойдет?

Благодаря Тони, я думаю, что получил ответ.

вот мое объяснение:

На основе С++ 0x 7.3.3.3 и 12.8.10 описание использования в Derive будет объяснено так:

class Derive : public Base
{
public:
 int num;
 //using Base::operator =;
 Base& operator=(const Base &b); // comes form the using-statement
 Base& operator=(string& str); // comes form the using-statement
 Derive& operator=(const Derive &); // implicitly declared by complier
};

Итак, когда я писал:

string str("test");
derive1 = str;

функция Base& Base::operator=(string& str); будет вызываться,

и когда я писал:

Base b1;
derive1 = b1;

функция Base& Base::operator=(const Base &b); будет вызываться,

finnaly, когда я писал:

derive2 = derive1;

функция Derive& Dervie::operator=(const Derive&); будет вызываться.

2 ответа

Стандарт 7.3.3-4 (из старого проекта, но в этом отношении все еще действителен):

Если оператор присваивания, полученный из базового класса в область производного класса, имеет подпись оператора присваивания копии для производного класса (class.copy), использование-декларация само по себе не подавляет неявное объявление оператор присваивания класса производного класса; оператор копирования-назначения из базового класса скрыт или переопределяется неявным образом объявленным оператором присваивания копии производного класса, как описано ниже.

Итак, используется неявный Derived::operator=().


Он выведет производный operator=, который в своей автоматически сгенерированной реализации вызовет operator= из Base, а также скопирует элементы в Derive.

licensed under cc by-sa 3.0 with attribution.