Теперь, если класс не полиморфен, компилятору не удастся выяснить, указывает ли pCar на honda или toyota car. Обратите внимание, что это только один из способов реализации dynamic_cast, поскольку стандарт C ++ ничего не говорит о vtables.
дующем коде при построенииobj
в случае 1 мы строимderived
Объект класса тоже, но его функции-члены просто недоступны дляobj
, Таким образом, при снижении (то есть, в случае 2), используяobj
в качестве источника мы построилиderived
в этом уже. Почему быobj
нужно быть полиморфным?
Если я перепутал вас с моим приведенным выше описанием, почему бы неobj
должен быть полиморфным при апскейтинге, но при апгрейдеделает должен быть полиморфным при использованииdynamic_cast
?
class base
{
public:
base()
{
cout<< " \n base constructor \n";
}
};
class derived : public base
{
public:
derived()
{
cout << " \n derived constructor \n";
}
};
base *obj = dynamic_cast<base*> (new derived); // case 1: explicitly upcasting
derived *OBJ = dynamic_cast<derived*> (obj); // case 2: error