В C ++, если функция-член является виртуальной, когда можно использовать статическое связывание? - PullRequest
3 голосов
/ 06 ноября 2008

В C ++, когда виртуальная функция может использовать статическое связывание? Доступ к нему осуществляется через указатель, напрямую или никогда?

Ответы [ 3 ]

7 голосов
/ 06 ноября 2008

Когда виртуальный метод вызывается через указатель или ссылку, используется динамическое связывание. В любое другое время используется привязка во время компиляции. Пример:

class C;

void Foo(C* a, C& b, C c) {
  a->foo();  // dynamic
  b.foo();  // dynamic
  c.foo();  // static (compile-time)
}
6 голосов
/ 06 ноября 2008

Если вы хотите вызвать версию функции базового класса, вы можете сделать это, явно назвав базовый класс:

class Base
{
public:
  virtual ~Base() {}
  virtual void DoIt() { printf("In Base::DoIt()\n"); }
};

class Derived : public Base
{
public:
  virtual void DoIt() { printf("In Derived::DoIt()\n"); }
};

Base *basePtr = new Derived;
basePtr->DoIt();  // Calls Derived::DoIt() through virtual function call
basePtr->Base::DoIt();  // Explicitly calls Base::DoIt() using normal function call
delete basePtr;
2 голосов
/ 06 ноября 2008

Статическое связывание может быть выполнено только тогда, когда тип объекта полностью однозначен во время компиляции. Я могу думать только о четырех местах, где тип абстрактного объекта однозначен: в конструкторе, в деструкторе, когда объявлен локально и в той же области видимости, что и динамическое размещение. Я не очень хорошо знаю этот стандарт, поэтому не могу сказать, что он говорит об этих четырех возможностях (я бы сказал, что первые два статически связаны, третий возможен статически, а последний нет; или зависит от реализации). Помимо этих точек, объект, доступ к которому осуществляется через указатель базового класса, может указывать на производный класс, и текущая единица перевода не может знать, поэтому статическое связывание невозможно. Функция может быть вызвана с указателем на базовый класс в одном экземпляре и указателем на производный класс в другом!

...