Какую функцию он будет вызывать? - PullRequest
3 голосов
/ 08 июня 2011

Вот код, я написал комментарии. Вопрос в том, что я не знаю, какая функция будет вызываться после отображения функции в классе 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&);.

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

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

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

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

1 голос
/ 08 июня 2011

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

...