Как виртуальные / абстрактные методы отображаются на диаграммах классов?

Во-первых, я из сообщества Java и все еще учусь на C ++.

Пожалуйста, посмотрите на следующие классы

введите описание изображения здесь

введите описание изображения здесь

На втором рисунке показан подкласс класса «GameObject». Он также имеет Display() метод. Есть 5 подклассов класса GameObject, и все они имеют это Display() метод. Итак, этот метод отображения в GameObject это виртуальный?

Я думаю, что это не абстрактное виртуальное (100% виртуальное), потому что Display() в GameObject отображает некоторые тексты в GameObject.cpp

Во всяком случае, я не совсем уверен. Пожалуйста помоги!

0

Решение

В C ++ виртуальные функции являются виртуальными тогда и только тогда, когда они были явно объявлены виртуальными в базовом классе или в самом классе. Поскольку у GameObject, похоже, нет базового класса, GameObject::Display() Должен быть объявлен виртуальным, если отображение ссылки (или указателя) GameObject должно вести себя в соответствии с фактическим (то есть временем выполнения) типом объекта, стоящего за этой ссылкой.
Наличие тела функции в GameObject.cpp не означает, что функция не является чисто виртуальной (эквивалент C ++ для абстракта java). Вы можете сделать функцию чисто виртуальной, добавив = 0 к его объявлению. Тем не менее, вы можете предоставить реализацию для чисто виртуальных методов, например, иметь реализацию по умолчанию, которую вы явно вызываете в производных классах, реализующих метод:

class GameObject {
//...
public:
virtual void Display() = 0;
};

//GameObject.cpp
void GameObject::Display() {
/* do something */
}

//DerivedGO.h
class DerivedGO : public GameObject {
public:
// virtual can be left out here, since it's declared virtual in the base class
virtual void Display() {
prepDisplay(); // do some preparation
GameObject::Display(); //call the original/default implementation
}
};

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

2

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

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

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