Во-первых, я из сообщества Java и все еще учусь на C ++.
Пожалуйста, посмотрите на следующие классы
На втором рисунке показан подкласс класса «GameObject». Он также имеет Display()
метод. Есть 5 подклассов класса GameObject, и все они имеют это Display()
метод. Итак, этот метод отображения в GameObject
это виртуальный?
Я думаю, что это не абстрактное виртуальное (100% виртуальное), потому что Display()
в GameObject
отображает некоторые тексты в GameObject.cpp
Во всяком случае, я не совсем уверен. Пожалуйста помоги!
В 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
}
};
Однако имейте в виду, что создание функции чисто виртуальной означает, что содержащий класс является абстрактным, а также каждый производный класс, который не перекрывает все чисто виртуальные функции из своих базовых классов.
Других решений пока нет …