2013-02-25 6 views
0

Во-первых, я прихожу из сообщества Java и все еще участвую в C++.Как виртуальные/абстрактные методы отображаются в диаграммах классов?

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

enter image description here

enter image description here

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

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

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

+0

У 'Display' есть' virtual' спецификатор в 'GameObject'? – StoryTeller

+0

@StoryTeller: Привет, нет кода нет. Я тот, кто собирается его реализовать, это диаграмма, которую я снабжаю –

+0

Если «нет кода», где вы получили «тексты в GameObject.cpp»? –

ответ

2

В 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 
    } 
}; 

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

+0

Спасибо за ответ, но мне нужно реализовать класс. Нет существующего кода. Прежде чем я это сделаю, мне нужно знать, имеет ли этот класс абстрактный или виртуальный метод. Я человек, который это сделает. Так этот метод является виртуальным? –

+0

@Yohan, если бы это была Java, вы бы указали метод в базовом классе 'final'? Если нет, значит, вы ожидаете, что подклассы переопределяют его, и он должен быть виртуальным на C++. Теперь спросите себя, является ли метод абстрактным в Java (не имеет реализации). Если это так, отметьте его чисто виртуальным в C++ и не создайте тело. – StoryTeller

+0

@Yohan Я обновил ответ, но, возможно, вам следует также посоветоваться с учебником по вашему выбору относительно виртуальных методов. –

Смежные вопросы