Что происходит, когда чисто виртуальная функция вызывается в экземпляре родительского класса, в котором она объявлена? - PullRequest
0 голосов
/ 29 марта 2019

Я новичок в C ++ и столкнулся с интересной проблемой в некотором коде, с которым я работал в последнее время. Предположим, у нас есть следующие классы: Parent, Child_A, Child_B и Child_C:

class Parent {
    ...
    virtual int Foo() = 0;
    ...
}


class Child_A : Parent {
    ...
    int Foo() { return 1; }
    ...
}

class Child_B : Parent {
    ...
    int Foo() { return 2; }
    ...
}

class Child_C : Parent {
    ...
    int Foo() { return 3; }
    ...
}

Теперь я знаю, что произойдет, если я сделаю это:

std::unique_ptr<Child_A> a = std::make_unique<Child_A>();
Parent *p = &a;
p->Foo();

Это вернется 1. Но мой вопрос: что произойдет, если я сделаю это:

std::unique_ptr<Parent> p = std::make_unique<Parent>();
p->Foo();

Спасибо всем, кто может помочь!

Редактировать: Оказывается, мой вопрос не имеет никакого смысла, независимо от того, сколько раз я пытаюсь исправить свой синтаксис. Чистая виртуальная функция не может быть вызвана таким образом у родителя. Позже я узнал, что код, который я искал, установил родителя равным члену одного из его дочерних классов (с определенной виртуальной функцией), прежде чем он вызвал эту функцию ... Я только что пропустил его раньше.

Ответы [ 2 ]

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

Вы немного неправильно поняли синтаксис C ++, несмотря на то, что ваши классы не наследуются от родительского класса.

Когда вы объявляете функцию-член, подобную этой void foo() = 0, вы говорите, что ваша функция не реализована, и вы делаете свой класс абстрактным, и вы не можете создать экземпляр абстрактного класса. Чистая виртуальная функция не означает «вернуть 0».

1 голос
/ 29 марта 2019

Если вы хотите иметь возможность создания экземпляра родителя, вы можете сделать функцию виртуальной (а не чисто виртуальной), а затем сделать так, чтобы потомки переопределили эту функцию.

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