Предположим, что есть класс A и класс B, который наследует A. Как правильно использовать объекты B?
Я видел в «cplusplus.com», что они «используют» объекты B таким образом:
B b;
A* a=&b;
В чем разница между использованием указателя класса «A» и использованием b?
Спасибо!
Преимущество использования указателей на базовые классы появляется, когда у вас есть виртуальные функции.
Представьте себе следующее
class A {
A(){}
virtual ~A(){} // note virtual destructor
virtual void func(){ cout << "A func" << endl; }
};
class B : public A {
B(){}
virtual ~B(){}
virtual void func(){ cout << "B func" << endl; }
};
class C : public A {
C(){}
virtual ~C(){}
virtual void func(){ cout << "C func" << endl; }
}
Теперь, если у нас есть указатель на базовый класс, мы можем вызвать func()
на нем и правильная функция вызывается в зависимости от того, указывает ли указатель на A
, B
или C
, Пример:
A* p1 = new A;
A* p2 = new B;
A* p3 = new C;
p1->func();
p2->func();
p3->func();
выведет следующее
A func
B func
C func
Теперь вы можете сказать, почему бы не использовать три разных указателя на типы A, B и C по отдельности, но что, если вам нужен массив указателей? Тогда все они должны быть одного типа, а именно A*
, Этот тип полиморфизма полезен для группировки вещей, которые похожи по функции или духу, но отличаются по реализации.
Они только сделали это, чтобы показать, что вы Можно, и этот полиморфизм вызывается, когда вы делаете.
Если вы просто хотите использовать свой B b
просто используйте его; нет A*
требуется.
Кроме того, изучение C ++ из интернет-учебников довольно похоже на изучение того, как готовить, анализируя жевательную резинку, которую вы нашли на улице. предпочитать правильная рецензируемая книга.