С ++ полиморфизм и другие функциональные вопросы - PullRequest
0 голосов
/ 17 июня 2010

у меня есть этот код:

class father{
public:
    virtual void f() { cout<<1;}
};

class son:public father{
public:
    void f() {cout<<2;}
};

void test (father x){x.f();}

int main(){
    son s;
    test(s);
}

вопрос говорит:

  1. вывод равен '1', какое правило о полиморфизме забыто программистом и как я могу это исправить, чтобы вывод был '2'?

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


другой вопрос написать функцию g, чтобы следующий код работал без сбоев

int x=11; g(x)=22;

Ответы [ 7 ]

3 голосов
/ 17 июня 2010

Когда вы передаете объект son в функцию тестирования по значению, он будет преобразован в объект father, поскольку test принимает father, а не son.Если вы хотите принимать экземпляры подкласса без преобразования, вам необходимо принять аргумент по ссылке или по указателю.

Поэтому, если вы измените подпись test на void test (father& x), она будет работать так, как вы хотите.

2 голосов
/ 17 июня 2010
  1. Передача сын с тест в качестве ссылки, а не копии.Если s передается как копия, она будет приведена к объекту отец в test .Вместо этого, используя ссылку s, он все равно будет вести себя как объект son .

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

добавление к папа :

виртуальный ~ папа() {}

2 голосов
/ 17 июня 2010

Я говорю своим студентам C ++ (на втором курсе), что полиморфизм никогда не подкрадется к ним; Во-первых, вам нужна иерархия наследования, а во-вторых, вам нужно использовать указатели.

1 голос
/ 17 июня 2010

Вы передали х по значению.Таким образом, компилятор преобразует объект son в объект отца, включая его таблицу виртуальных функций.Если вы хотите вызвать виртуальную функцию отца в тесте, вам нужно передать x либо по ссылке, либо по указателю.

0 голосов
/ 07 июня 2015

Ну, вы могли бы также внести некоторые изменения в вашу главную проблему, например, сделать указатель на ваш базовый класс I.e отец и указать его на адрес вашего дочернего класса obj, а затем использовать его в соответствии с вашими требованиями.

Это и есть основная структура полиморфизма.

0 голосов
/ 17 июня 2010

В функции «test» параметр «папа x» не является ссылкой на класс, это экземпляр отца, который будет скопирован из переданного параметра.

0 голосов
/ 17 июня 2010

Что это за тестовая функция, которая заставляет вас думать, что результат будет 2?

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