Детский класс C ++ с дочерним элементом - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь вспомнить мой C ++. Я не уверен, как это сделать. У меня есть родительский класс и дочерний класс. у родителя есть член, который является ссылкой на экземпляр другого другого объекта ... у дочернего класса есть ссылка на дочернюю версию этого другого объекта.

По сути, я хочу иметь родительский класс, который будет обозначать, какого рода члены он будет иметь, наряду с глобальными функциями-членами и виртуальными функциями, которые должны быть определены дочерними классами.

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

у нас есть человек, который наследуется BigPerson. У нас есть Дом, который наследуется BigHome.

Я хочу, чтобы класс Person обозначал, что у него есть Дом, однако у BigPerson должен быть BigHome (который все еще является Домом).

#include <iostream>

using namespace std;


class Home {
    public:

    virtual string sayHome()
    {
        cout << "Home";
    }
};

class BigHome : public Home
{
    public:
    int num = 5;
    virtual string sayHome() override
    {
        cout << "Big Home " << this->num;
    }

};


class Person
{
    public:

    Home& home;

    Person(Home& home) : home(home) {}

    virtual void sayHello()
    {
        cout << "hello";
    }

    virtual void talk()
    {
        this->sayHello();
        cout << ", I have a ";
        this->home.sayHome();
        cout << endl;
    }
};

class BigPerson : public Person
{
    public:

    BigPerson(BigHome& bigHome) : Person(bigHome) { }

    virtual void sayHello() override
    {
        cout << "big hello " << home.num;
    }
};




int main()
{
    Home home;
    BigHome bigHome;
    bigHome.num = 7;
    //*
    Person p(home);
    BigPerson bp(bigHome);
    //*
    p.talk();    
    bp.talk();
    //*/
    return 0;
}

Я получаю ошибку:

main.cpp: In member function ‘virtual void BigPerson::sayHello()’:
main.cpp:65:44: error: ‘class Home’ has no member named ‘num’
         cout << "big hello " << this->home.num;
                                            ^

1 Ответ

0 голосов
/ 20 марта 2019

class Person имеет члена home типа class Home &. При связывании во время компиляции он не знает, ссылается ли он на объект Home или BigHome, и, следовательно, невозможно указать на элементы BigHome.

.

Одним из возможных разрешений является использование dynamic cast или assert для проверки типа и static cast.

BigHome *p = dynamic_cast<BigHome *>(&home);
assert(p != nullptr);
cout << "big hello " << p->num;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...