Я пытаюсь вспомнить мой 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;
^