новый оператор -> с или без - PullRequest
0 голосов
/ 21 марта 2019

Цель

Попытка узнать разницу в поведении создания экземпляров объектов производного класса

Моя работа

  1. Создан класс "персона"
  2. В класс person добавлен виртуальный метод, который устанавливает значение переменной name
  3. Определен класс «employee», производный от базового класса «person»
  4. Добавлен метод к классу "employee", который устанавливает значение переменной name , изначально определенное в базовом классе, но добавляет после него суффикс "さ ん".
  5. Создал различные типы или инициации и проверил разницу между выходными данными

Определенные классы

Я создал базовый класс "person" и производный класс "employee", как показано ниже

человек

class person
{
protected:
    string name;
public:
    person();
    ~person();

    virtual void setName(string myName)
    {
        name = myName;
    }
};

сотрудник

class employee :    public person
{
public:
    employee();
    ~employee();
    void setName(string myName)
    {
        name = myName+"さん";
    }
};

Основной

int main()
{
    person newPerson = person();

    employee anotherPerson1 = employee();

    employee* anotherPerson2 = new employee();

    person extraPerson1 = employee();

    person* extraPerson2 = new employee();

    newPerson.setName("new");   
    anotherPerson1.setName("another1");
    anotherPerson2->setName("another2");
    extraPerson1.setName("extra1");
    extraPerson2->setName("extra2");


    cout << newPerson.getName() << endl;
    cout << anotherPerson1.getName() << endl;
    cout << anotherPerson2->getName() << endl;
    cout << extraPerson1.getName() << endl;
    cout << extraPerson2->getName();
}

Консольный вывод

new
another1さん
another2さん
extra1
extra2さん

Вопрос

Я понимаю поведение newPerson, anotherPerson1 и другихrPerson2.

Я не понимаю, почему extraPerson1 и extraPerson2 ведут себя по-разному, даже если оба имеют одинаковые инициации.

Пожалуйста, помогите!

1 Ответ

2 голосов
/ 21 марта 2019

С

person extraPerson1 = employee();

Вы срез employee объект в person объект.Объект extraPerson1 является объектом person, а не объектом employee.Когда вы вызываете функцию setName, вы вызываете person::setName.

Полиморфизм и виртуальные функции работают, только если у вас есть указатели или ссылки .

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