Я пытаюсь понять, как работает метод Overriding, не могу понять, почему вывод 2 - PullRequest
0 голосов
/ 18 мая 2019

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

public:
   int a;
   virtual void who(void) { a = 1; }
};



class B:public A{
public:
   int a;
   void who(void) { a = 2; }
};

class C :public B {
};

int main(void) {
   A x; B y; C z; A *p;
   p = &z;
   p->who();
   cout << z.a << endl;
       system("pause");
       return 0;
}



Ответы [ 2 ]

1 голос
/ 18 мая 2019

B переопределяет функцию who () своего родителя A. Это называется полиморфизмом.C наследуется от B, но ничего не переопределяет;таким образом, он использует всю реализацию B. p является указателем на объект класса A. Одна из ключевых особенностей наследования класса состоит в том, что указатель на производный класс совместим по типу с указателем на его базовый класс [1].

Это означает, что когда вы вызываете функцию-член указателя (p-> who ()), а класс объекта, на который указывает указатель, переопределяет член его родителя, происходитиспользовать переопределенный член.

Источники: [1] http://www.cplusplus.com/doc/tutorial/polymorphism/

0 голосов
/ 18 мая 2019

до тех пор, пока вы создаете функцию с тем же входом и выходом с именем; короче говоря: то же самое объявление функции ... новое будет использоваться, поскольку вы ссылаетесь на тот, у которого есть суперкласс, который имеет ту же функцию. в твоем случае; Суперкласс для C - это B, и он не видит A, но B видит A и использует все имеющиеся у него функции, кроме того, для которого B объявляет новую реализацию.

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