В общем случае указатель одного класса не может указывать на объект другого класса.
Но в производных классах указатель на базовый класс может указывать на объект производного класса, полученного из этого базового класса.
Для получения доступа к элементам подкласса с помощью указателя на базовый класс, нужно воспользоваться приведением типов.
Например, вызов функции show_phone() класса Nasl_object с приведением типов выглядит следующим образом:
((Nasl_class *)p)-> show_phone();
С технической точки зрения такое приведение типов является правильным, НО рекомендуется по возможности его избегать, так как приведение типов может служить источником дополнительных ошибок в коде.
Указатель на базовый класс может использоваться и как указатель на производный объект. ОДНАКО указатель на производный класс не может использоваться для доступа к объектам базового типа.
Операции инкремента и декремента указателя выполняются по отношению к его базовому классу.
То есть, если указатель на базовый класс указывает на объект подкласса, инкремент или декремент его не даст указатель на следующий объект подкласса. Поэтому нельзя использовать эти операции, когда они указывают на объект производного класса.
Ссылки на базовый класс могут быть использованы для ссылок на объект подкласса. То есть, если параметр является ссылкой на базовый класс, то он может принимать значение ссылки, как на объект базового класса, так и на объекты подкласса. Такая техника наиболее употребительна при работе с функциями.