Доступ к дочерним методам-членам из функции, принимающей родительский класс - PullRequest
0 голосов
/ 22 марта 2020

Тестовая функция должна принимать любой объект класса, производный от Parent, и обращаться к реализации Child Function(). Мне кажется, это легко сделать. Я пытался сделать следующее. это кажется интуитивно правильным, но это не работает. Он по-прежнему вызывает Parent реализацию Function()

Class Parent
{
Public:
    Parent();
    ~Parent();

    virtual void Function() = 0;

};

Class Child : public Parent
{
Public:
    Child();
    ~Child();
    void Function(){
        // Do something
    };
};

void Test(Parent Object)
{
    Object.Function();
};

int main()
{
    Child Object;
    Test(Child);
    return 0;
}

Как реализовать такую ​​вещь?

Я что-то упустил? или это решение далеко от того, чего я пытаюсь достичь?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Чтобы использовать виртуальные функции в C ++, вы должны использовать ссылку или указатель. Попробуйте это

void Test(Parent& Object) // reference to Parent
{
    Object.Function();
};

Вам следует изучить нарезку объектов , чтобы понять, что не так с вашей версией и почему вы должны использовать ссылку или указатель.

0 голосов
/ 22 марта 2020

Parent.Function(); должно быть object.Function(); и таким же для дочернего объекта.

Обратите внимание, что вы передаете копию дочернего объекта, и она будет разрезана, потому что поведение polymorphi c может быть демонстрируется указателями или ссылками, а не обычными объектами.

У вас есть много опечаток, таких как Class, Public и ; в неправильных местах.

Обратите внимание, что

void Test(Parent Object)
{
        Object.Function();
}

Это неправильно, поскольку Parent является абстрактным классом, и вы не можете создавать объекты абстрактных классов.

Ниже приведен пример того, что вы хотите сделать с помощью указателей

#include<iostream>
class Parent
{
public:
    Parent(){}
    virtual ~Parent(){}

    virtual void Function() = 0;

};

class Child : public Parent
{
public:
    Child(){}
    ~Child(){}

    void Function(){
        std::cout<< "In Child";
    }
};

void Test(Parent* object)
{
    object -> Function();
}

int main()
{
    Parent* parentPtrToChild = new Child;
    Test(parentPtrToChild);
    delete parentPtrToChild;
    return 0;
}

ИЛИ используйте следующее со ссылками

void Test(Parent& object)
{
    object.Function();
}

int main()
{
    Child childObj;
    Test(childObj);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...