с приведенным ниже кодом у меня есть следующие вопросы, касающиеся скрытия / переопределения:
1) Если я вызову DoStuff с p, какая реализация DoStuff будет вызвана?
2) Если я удалю ключевое слово «virtual» из реализации Drive в Prius, будет ли DoStuff (p) и по-прежнему работать?
3) То же, что и выше, кроме DoStuff (t)?
4) Изменение Car* c
за Toyota *t
(Любые общие советы, не относящиеся к перечисленным выше вопросам, приветствуются)
class Car
{
public:
virtual void Drive();
};
class Toyota : public Car
{
public:
virtual void Drive();
};
class Prius : public Toyota
{
public:
virtual void Drive();
};void DoStuff(Car* c)
{
c->Drive();
}
int main()
{
Car* c = new Car();
Toyota* t = new Toyota();
Prius* p = new Prius();
DoStuff(c);
DoStuff(t);
DoStuff(p);
}
1) Если я вызову DoStuff с p, какая реализация DoStuff будет вызвана?
Посмотреть на себя (Я тоже исправил твой код)
2) Если я удалю ключевое слово «virtual» из реализации Drive в Prius, будет ли DoStuff (p) и по-прежнему работать?
Когда-то виртуальный, всегда виртуальный (то есть, если базовый класс объявляет функцию как virtual
, это всегда virtual
в производных классах, независимо от того, заявляют они или нет virtual
)
3) То же, что и выше, кроме DoStuff (t)?
Смотри выше.
4) Изменение
Car* c
заToyota *t
Я собираюсь угадать примеры, которые я уже привел, чтобы ответить на этот вопрос (надеюсь, потому что я не уверен, что этот вопрос спрашивает).
5) Что если я удалю
virtual
отCar
?
Вы не задавали этот вопрос, но я бы хотел, чтобы у вас был. Все предыдущие примеры имеют дело с переопределением. Если вы сделаете это, то получите функцию скрытия. Даже если производные классы говорят virtual
если базовый класс не скрывает функцию.
Других решений пока нет …