Прямой ответ на ваш вопрос: вы не можете определить переменную члена класса абстрактного типа. В C ++ член в основном определяется объемом памяти и, поскольку унаследованный класс может требовать другой объем памяти, это невозможно.
Однако вы можете использовать указатели или ссылки.
В вашем случае:
class Teacher : public Person
{
public:
double getSalary();
private:
Person* manager;
}
Здесь хранится указатель на Person
, и, поскольку Teacher
is-a Person
, объект типа Teacher
будет допустимой целью.
Пример использования: мы создаем сеттер
Teacher::set_manager(Person* manager)
{
this->manager = manager;
}
и назовите это как
Teacher a;
Teacher* b = new Teacher;
a.set_manager(b);
(я использовал сеттер как самый простой пример, не обязательно, потому что я бы рекомендовал так поступать.)
Также возможно:
Teacher a;
Person* b = new Teacher;
a.set_manager(b);
(a
должно быть Teacher
, хотя, поскольку нам нужен метод set_manager
, если мы не хотим разыгрывать)
Еще лучше, кстати, здесь использовать умные указатели. Читайте в std::shared_ptr
и связанных с этим. Это будет выглядеть как
std::shared_ptr<Person> manager;
Важное отличие здесь: если вы привыкли к демонам мусора, вам необходимо вручную освободить память необработанного указателя, тогда как умные указатели автоматически освобождают память, когда ничто больше не указывает на объект.
Тем не менее, вы, кажется, думаете, что языки более похожи, чем они. Я рекомендую начать с самого начала с базового учебного пособия по C ++, даже если вы оказались опытным программистом C #.