Преобразовать объектАв объектВнельзя, т.к. объектВбольше. Он являетсянадмножеством объектаА.Таким образом:
bp = ap ;// - не допустимо!
Преобразовать объект В в объект А вполне допустимо, так как в объекте В целиком содержится объект А. “Лишние” переменные просто “отрежутся”.
ap = bp ; //допустимо
Действительно указатель представляет собой адрес начала объекта В, а в случае наследования сначала формируется базовая часть объекта, т.е. объект производного класса всегда начинается с переменных базового. Таким образом, указатель на производный класс (по значению) одновременно является указателем на базовый класс.
В результате предложения указатель apпо значению будет равен указателюbp,но будет указывать только на начальную часть объекта В.
Для этого указателя не доступны ни переменные b1, b2, ни функция func_b:
ap->func_a( ) ;// допустимо
ap-> func_b( ) ;// не допустимо!
Рассмотрим случай, когда функция производного класса замещает функцию базового класса ( т.е. имеет то же имя и параметры).
class A {
protected :
int a1 , a2 ;
public:
void func ();
};
class B : public A {
int b1, b2 ;
public :
void func ();
};
void main ( ) {
A* ap = new A;
B* bp = new B ;
bp->func() ; //вызывается функция класса В
bp->A::func(); //вызывается функция класса A
ap= bp ;
ap->func(); //вызывается функция класса A
ap-> B::func () //недопустимо! B::func( ) не доступна через ap
Таким образом, нельзя через указатель на базовый класс обращаться к компонентной функции производного класса.
Механизм виртуальных функций снимает этот запрет и позволяет с помощью указателя на базовый класс обращаться к функциям производных классов (после присваивания этому указателю значения указателя на соответствующий производный класс).
Если бы func ()была объявлена как виртуальная, то предложение:
ap-> func( );
привело к вызову функции производного класса B::func( ).
Работа с виртуальными функциями.
Механизм виртуальных функций можно использовать как для вертикальной цепочки классов, производных друг от друга так и для горизонтальной группы классов, находящихся на одном уровне иерархии и производных от одного итого же базового класса.