ни pba
, ни pbb
является объектом, но они являются указателями типа базового класса Base
так в коде, который вы использовали его указатели полиморфно, который означает, что базовый указатель может указывать на тот же класс или его производный объект класса.
объект создается с новым не ПБВ или PBA себя, рассмотрим следующий пример:
#include <string>
#include <iostream>
using namespace std;
class Base
{
public:
virtual void Print() const { cout << "Base print()" << endl;} // virtual function
void Greet()const {cout << "in Base Say: hello!" << endl;}
};
class Derived : public Base
{
public:
void Print() const { cout << "Derived print()" << endl;} // ovrode the base member pritn()
void Greet()const {cout << "in Derived Say: hello!" << endl;}
};
int main()
{
Base* pba = new Derived;
pba->Print(); // Derived print()
pba->Greet(); // in Base Say: hello! ??? because Greet() is not virtual
Base* pbb = new Base;
pbb->Print(); // Base print()
pbb->Greet(); // in Base Say: hello!
return 0;
}
так во время выполнения указатель РВА и ПБД может быть присвоен объект базы или производный классы, таким образом, вызываются соответственно.
Это экземпляр * полиморфизма *. Вы не можете ожидать, что мы предоставим вам исчерпывающий ответ, так как это довольно широкий вопрос (и я уверен, что здесь есть несколько дубликатов). – Downvoter
И это пример для dynamic_cast. Если вы пишете _Derived * pba = new Derived; _ , тогда эта строка не имеет смысла _pd = dynamic_cast (pba); _ –
Если у вас есть [кошки и собаки в наборе] (https: //en.wikipedia .org/wiki/Polymorphism_% 28computer_science% 29% 23Subtyping), и хотите, чтобы все животные в этом наборе произносили звук, вы вызываете «Animal :: talk()» для каждого животного, но этот вызов даст разные результаты, основанные на на фактический класс животного. – Dialecticus