Переменная-ссылка и виртуальные функции - PullRequest
6 голосов
/ 03 декабря 2011

Я обнаружил странное поведение при использовании ссылочной переменной.

Вот реализации классов:

class Base {
    public:
        virtual void Method() = 0;
};

class DerivedA : public Base {
    public:
        virtual void Method() {}
}

class DerivedB : public Base {
    public:
        virtual void Method() {}
}

Вот пример кода со странным поведением:

void main(int argc, char *argv[]) {
    DerivedA a;
    DerivedB b;
    Base &base = a;

    base.Method();   // Calls DerivedA::Method

    base = b;
    base.Method();   // Calls DerivedA::Method!!! Why doesn't call DerivedB.Method()?
}

В заключение, представляется, что таблица указателей виртуальных функций, «связанная» с эталонной переменной, определяется только при инициализации эталонной переменной.Если я переназначу ссылочную переменную, vfpt не изменится.

Что здесь происходит?

Ответы [ 2 ]

13 голосов
/ 03 декабря 2011

Base &base является ссылкой, то есть псевдонимом объекта a, поэтому присвоение base = b эквивалентно a = b, что оставляет вещь base тем же объектом того же класса.Это не переназначение указателя, как вы, вероятно, предполагаете.

7 голосов
/ 03 декабря 2011

Ссылки могут быть инициализированы только один раз.Вы не можете назначить новый объект для ссылки.На самом деле происходит то, что вызывается оператор = Base, а базовый объект по-прежнему DerivedA, а не DerivedB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...