Вопрос с виртуальными функциями - PullRequest
7 голосов
/ 28 января 2011

У меня есть два класса:

class x {
public:
  virtual void hello() {
    std::cout << "x" << std::endl;
  }
};

class y : public x {
public:
  void hello() {
    std::cout << "y" << std::endl;
  }
};

Может кто-нибудь объяснить, почему следующие два вызова hello () выводят разные сообщения?Почему они оба не пишут "у"?Это потому, что первый является копией, а второй фактически указывает на объект в памяти?

int main() {
  y  a;

  x b = a;
  b.hello(); // prints x

  x* c = &a;
  c->hello(); // prints y
  return 0;
}

Ответы [ 4 ]

6 голосов
/ 28 января 2011

Потому что x b = a; нарезает объект.

Когда этот код выполняется, он создает новый x, а не y, который является копией оригинала y, a '.

6 голосов
/ 28 января 2011

Да, вы правы

x b = a;

Вызывает конструктор копирования (b IS и 'x')

x& b = a;

Назначает ссылку и будет использовать переопределение (b все еще на самом деле является 'y')

0 голосов
/ 28 января 2011

b.hello() печатает "x", потому что b является экземпляром класса X. c->hello() печатает "y", потому что c указывает на a, а a является экземпляром класса Y.

Что может сбить вас с толку, так это то, что когда вы пишете x b = a;, вы создаете новый объект b и инициализируете его с помощью a. Когда вы пишете x* c = &a;, c не является новым объектом. Вы только что ввели псевдоним для существующего объекта.

0 голосов
/ 28 января 2011

x b = a копирует от а до б. Так как b - это тип x, вы получите объект типа x. Объект типа x напечатает x.

Единственный способ получить y - это вызов объекта типа y.

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