Будут ли переопределения вызываться при отправке экземпляра класса, как если бы он был типом без переопределений? - PullRequest
1 голос
/ 02 февраля 2011

Имея класс B, который расширяет класс A и переопределяет его функции, мы можем быть уверены, что при отправке экземпляра (B *), как если бы это был тип (A *), наши переопределения, созданные нами в классе B, будут называться?

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Пока метод A определен как виртуальный, это будет иметь место как для указателей, так и для ссылок. Например

class A {
  virtual void Method() {
    cout << "A::Method" << endl;
  }
};

class B {
  // "virtual" is optional on the derived method although some
  // developers add it for clarity
  virtual void Method() {
    cout << "B::Method" << endl;
  }
};

void Example1(A* param) {
  param->Method();
}

void Example2(A& param) {
  param.Method();
}

void main() {
  B b;
  Example1(&b);  // Prints B::Method
  Example2(b);   // Prints B::Method
}
3 голосов
/ 02 февраля 2011

Да, если функции объявлены virtual - см. http://www.parashift.com/c++-faq-lite/virtual-functions.html

2 голосов
/ 02 февраля 2011

Только если функция в A объявлена ​​virtual. При объявлении virtual любые переопределенные дочерние функции вызываются даже при приведении в качестве родительского класса.

...