2013-06-17 4 views
1

Сценарий:Кастинг указателя базового класса на неизвестный подкласс возможно как-то?

BaseClass* pointer = &subClassXObject; // subClassXObject is object of class subClassX 
             // which is derived from BaseClass and 
             // Instance<subClassX>. (Instance<subClassX> is 
             // for counting instances of type subClassX.) 
             // Instance<subClassX> is derived from 
             // BaseInstance. 

& ... стоит для получения адреса, C++ Стандартная терминология может определить объект как адрес уже, в этом случае & ... является сам объект

Класс subClassXObject в данный момент неизвестен, это может быть любой определенный подкласс BaseClass.

Известно, что это один из прямых производных подклассов BaseClass, каждый из которых также наследует экземпляр SubClassX >, где subClassX является именем прямого производного подкласса BaseClass.

Экземпляр <subClassX> наследуется от BaseInstance. BaseInstance определяет общедоступную чистую виртуальную функцию, которую реализует экземпляр <subClassX>, это имя getDescriptor.

Таким образом, каждый объект subClassObject имеет доступ к getDescriptor.

SubClassX* pointer = &subClassXObject; 
pointer->getDescriptor();    // This should work 

(Или это не сейчас я отсев:? Я должен явно реализовать открытый метод базового класса в подклассе для того, чтобы кто-то будучи в состоянии назвать его по подклассу снаружи нет .. ., не так ли?).

Мне нравится

BaseClass* pointer = &subClassXObject; 
pointer->getDescriptor(); 

работать.

Перемещение getDescriptor из BaseInstance и Instance <subClassX> к BaseClass и каждый подклассов можно, однако я хочу пользователей моего BaseClass только писать логику коду приложения, а не инфраструктуры кода (даже если они только должны были бы возвращать Instance <subClassX> методы возвращают значение). Идея этого заключается в создании браузера объектов, в который каждый экземпляр объекта добавляется и отображается без необходимости добавления любого неклассического кода.

Указатель на использование BaseInstance * вызывает сбой приложения. Таким образом, мой вопрос сформулирован в заголовке .

Благодарим вас за заботу!

+0

Название вашего вопроса гласит: «...указатель заливки базового класса к неизвестному подклассу ... ». Текст вашего вопроса описывает бросок в противоположном направлении: от подкласса к базовому классу. Итак, в каком направлении вы хотите бросить? – AnT

+0

Это может быть больше транс -class cast: от BaseClass до BaseInstance, поскольку я не знаю subClassX.Я вижу, что это не является вполне определяемым в коде без RTTI (который я не хочу касаться), таким образом, я удалил последний абзац. Возможно, какое-то дополнение Экземпляр может достичь определяемости? –

+0

Я не понимаю: subClassX - это как раз такой же ребенок BaseInstance, как и у BaseClass - тем более, что BaseInstance на первом месте. Если таблица виртуальных функций работает для BaseClass *, она должна работать одинаково для BaseInstance * Он должен работать, если он был объявлен BaseInstance с самого начала. Если это так, то почему приложение сбой после кастома? –

ответ

0

Объявить указатель BaseClass * как указатель BaseInstance *. Тогда актер не нужен, и он работает.

Методы BaseInstance можно использовать только тогда, когда будет сбрасываться на BaseClass *. Поскольку методы используются в браузере объектов, это касается функций инфраструктуры, они имеют больше смысла в BaseInstance, чем в BaseClass, поэтому невозможно использовать методы BaseClass (лучше всего BaseClass содержит только базовые методы логики приложения).

0

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

class Base{ 
public: 
virtual int getDescriptor(); 
}; 
+0

, когда я делаю это, бросок не падает, но он не применяется: Base :: getDescriptor() вызывается вместо subClassX :: getDescriptor (который получает свой getDescriptor фактически от экземпляра). Перемещение всего на BaseClass и subClassX будет работать, но, как написано, я не хочу этого делать. –

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