Вот код, я написал комментарии.
Вопрос в том, что я не знаю, какая функция будет вызываться после отображения функции в классе 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;
}
Но результат кода: Derive2.num равен 1 !!!, это означает, что весь класс был скопирован после проверки, почему это произошло?
Благодаря Тони, я думаю, что получил ответ.
вот мое объяснение:
На основе C ++ 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);
,
В конце концов, когда я написал:
derive2 = derive1;
будет вызвана функция Derive& Dervie::operator=(const Derive&);
.