Указатели на объекты производных классов

Указатель, имеющий тип базового класса, может ссылаться на объект любого производного класса. Следует помнить, что такой указатель имеет доступ только к наследуемым членам базового класса и виртуальным методам (см. разд. 13.20). Чтобы получить доступ к членам производного класса нужно выполнить приведение типов (листинг 13.28). Кроме того, при использовании адресной арифметики необходимо учитывать, что указатель будет перемещен на размер базового класса, а не производного. Это может привести к ошибке.

Листинг 13.28. Указатели на объекты производных классов

#include <iostream>

class A {
public:
   void func1();
};
class B : public A {
public:
   void func2();
};

void A::func1() { std::cout << "A::func1()" << std::endl; }
void B::func2() { std::cout << "B::func2()" << std::endl; }

int main() {
   A *pA;
   B b;
   pA = &b;            // Адрес производного класса
   pA->func1();        // A::func1()
   // pA->func2();     // Ошибка. Нужно выполнить приведение типов
   ((B *)pA)->func2(); // B::func2()
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов