cpp доступ к методам объекта подкласса из функции, которая требует объекта суперкласса - PullRequest
0 голосов
/ 16 января 2019

Я написал следующий код:

// constructors and derived classes
#include <iostream>
using namespace std;

class Mother
{
  public:
    int age;
    Mother()
    {
        cout << "Mother: no parameters: \n"
             << this->age << endl;
    }
    Mother(int a)
    {
        this->age = a;
    }
    void sayhello()
    {
        cout << "hello my name is clair";
    }
};

class Daughter : public Mother
{
  public:
    int age;
    Daughter(int a)
    {
        this->age = a * 2;
    };
    void sayhello()
    {
        cout << "hello my name is terry";
    }
};

int greet(Mother m)
{
    m.sayhello();
}

int main()
{
    Daughter kelly(1);
    Son bud(2);
    greet(kelly);
}

и мой вопрос таков: Поскольку Келли является экземпляром класса, производного от Mother, для меня имеет смысл, что я могу передать его в функцию, которая требует объект типа mother, т.е. здороваться. Мой вопрос заключается в следующем: можно ли вызвать функцию sayhello изнутри greet, чтобы она он будет говорить «привет, меня зовут Терри» вместо «привет, меня зовут Клэр».

1 Ответ

0 голосов
/ 16 января 2019

То, что вы запрашиваете, называется «полиморфным поведением» (или «динамической диспетчеризацией»), и это базовая функция C ++. Чтобы включить его, вам нужно сделать пару вещей:

  1. Пометьте ваши sayhello() методы ключевым словом virtual (т.е. virtual void sayhello(), а не просто void sayhello())

  2. Измените аргумент метода greet() на передачу по ссылке или передачу по указателю, чтобы избежать проблем с разделением объектов (т. Е. int greet(const Mother & m) вместо int greet(Mother m))

Как только вы это сделаете, компилятор будет разумно выбирать, какой метод sayhello() вызывать во время выполнения, на основе фактического типа объекта аргумента m, а не жестко кодировать выбор во время компиляции. основанный на типе, явно указанном в списке аргументов функции greet.

...