Путаница в понимании вызова виртуальной функции и зависимого базового класса - PullRequest
3 голосов
/ 20 октября 2011

Я читаю из электронной книги полное руководство, и вопрос, который я задам, может быть глупым для вас, но ..

В этом разделе есть раздел 9.4.2 Зависимые базовые классы что я не могу понять.

Вот частичный текст из него: http://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
  public: 
    void f() { Base<T>::basefield = 0; } 
}; 

Мне нужна помощь для визуализации строки (или проблемной области) в тексте выше " Необходимо соблюдать осторожность с этим решением, потому что если неквалифицированное независимое имя используется для формирования вызова виртуальной функции, то квалификация запрещает механизм виртуального вызова, и значение программы изменяется. Тем не менее, существуют ситуации, когда первый вариант не можетиспользовать эту альтернативу "

Я понимаю безусловное независимое имя и т. д., но смешивание их с вызовом виртуальной функции - это то, что ускользает от меня.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Если квалифицированное имя (базовое поле) является виртуальной функцией, то квалификация запрещает виртуальный вызов. Это очень похоже на то, как если бы у вас было:

struct Base {
  virtual void vCall() { }
};

struct Derived : public Base {
  virtual void vCall() { }
};

int main() {
  Derived d;
  Base* inst = &d;
  inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
                       // this calls Base::vCall directly
}
1 голос
/ 26 декабря 2011

Использование квалифицированного идентификатора class-name::function() запрещает виртуальное значение function, поэтому вместо него следует использовать this->function().

Это также работает для членов данных: this->basefield.

...