Переопределение / скрытие / наследование вопросов с кодом?

с приведенным ниже кодом у меня есть следующие вопросы, касающиеся скрытия / переопределения:

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

Решение

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если базовый класс не скрывает функцию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]