Тема: Вопрос начинающего.

Первые шаги в ObjectARX.
Относитесь к моим вопросам снисходительно.
Метод addCommand класса AcEdCommandStack является чисто виртуальным, т.е. интерфейсом, который не определяется в классе, а должен определяться в классах наследниках. Макрос acedRegCmds, тем не менее, вернув указатель на объект класса AcEdCommandStack (что тоже не понятно, т.к. согласно учебным канонам языка С++ существование объекта абстрактного класса невозможно) преспокойно обращается к этому методу (= 0)?
Поскольку всё это работает, очевидно я где-то заблуждаюсь. Где?

Re: Вопрос начинающего.

Тот-же вопрос в другой форме.
Дла объекта класса AcEdCommandStack (объект абстрактного класса ???) вызывается метод addCommand, который объявлен в этом классе, как чисто виртуальный (тело = 0).
Как такое может быть?

Re: Вопрос начинающего.

Это очень просто: дело в том, что в хедеры (*.h) ObjectARX API вынесен только прародитель того класса, который реально функционирует в AutoCAD. Т.е. при запросе подобного указателя, на самом деле идет обращение к классу-наследнику (см. Страуструпа, Липмана и т.п.).
А сделано это для того, чтобы, например, нельзя было вот так просто создать собственный AcEdCommandStack.

Re: Вопрос начинающего.

На примере все того-же макроса acedRegCmds:
#define acedRegCmds \
AcEdCommandStack::cast(acrxSysRegistry()->at(ACRX_COMMAND_DOCK))
Пробую рассуждать.
1. Функция acrxSysRegistry() возвращает указатель на
AcRxDictionary - класс,который объявлен как абстрактный.
Если я правильно понял, на самом деле функция обращается к объекту некоего класса  -  наследника AcRxDictionary, созданного, видимо, системой ACAD. Этот класс-наследник просто реализует все чисто виртуальные функции класса AcRxDictionary.
2. Чтобы вернуть указатель на базовый класс, внутри функции
проводится приведение к его(указателя) к базовому классу. При этом, указатель на базовый класс должен каким то образом нести в себе информацию о том, на что он реально указывал раньше , т.е. на класс наследник.
3. Используя таблицу виртуальных функций вызывается метод
at(const char*) именно класса наследника (где, собственно, он реально определен)
Так ли?

Re: Вопрос начинающего.

Угу. Только второе условие по-моему соблюдается автоматически. Т.е. указателю нет смысла нести какую-то дополнительную информацию о том, на что он указывает, поскольку и так все ясно из его значения :) А все потому, что с любым классом-наследником можно оперировать как с классом-родителем. Это одно из базовых свойств ООП. Механизм того, как это обеспечивается на низком уровне в С++, описан в книжках... но в моей голове он не удержался настолько, чтобы я мог его изложить как следует.

Re: Вопрос начинающего.

Спасибо за помощь.