主要分两种情况:
#include <iostream> using namespace std; class Base { public: Base() {}; virtual void show() { cout << "This is Base class" << endl;; }; }; class Sub :public Base { public: int b; Sub() {}; void show() { cout << "This is Derived class" << endl;; } }; int main() { //向上转型:派生类指针转换为其基类类型 本身是安全的,也可以通过dynamic_cast/static_cast进行转换 Base* base_0; Sub* su = new Sub(); base_0 = su; //base_0 = static_cast<Base*>(su); //base_0 = dynamic_cast<Base *>(su); //base_0->show(); }
#include <iostream> using namespace std; class Base { public: Base() {}; virtual void show() { cout << "This is Base class" << endl;; }; }; class Sub :public Base { public: int b; Sub() {}; void show() { cout << "This is Derived class" << endl;; } }; int main() { // 安全的向下转型 // 基类指针指向对象是派生类,转换安全 Base* base = new Sub; if (Sub* sub = dynamic_cast<Sub*>(base)) { cout << "succeed" << endl; } else { cout << "failed" << endl; } base->show(); delete base; base = nullptr; // 基类指针指向的对象是基类,转换失败 Base* base_01 = new Base(); if (Sub* sub_01 = dynamic_cast<Sub*>(base_01)) { cout << "succeed" << endl; } else { cout << "failed" << endl; } base_01->show(); delete base_01; base_01 = nullptr;
#include <iostream> using namespace std; class Base { public: Base() {}; virtual void show() { cout << "This is Base class" << endl;; }; }; class Sub :public Base { public: int b; Sub() {}; void show() { cout << "This is Derived class" << endl;; } }; int main() { //引用类型转换, //引用向上转换 // Sub c; Sub& cc = c; Base& b = dynamic_cast<Base&>(cc); b.show(); //向下转换 //第一种情况 Sub re_c; Sub &re = re_c; Base& base_02 = dynamic_cast<Base&>(re); base_02.show(); //第二种情况,转换失败会抛出异常 Base base_03; Base& base_04 = base_03; //不存在空引用,dynamic_cast失败会抛出bad_cast异常 try { Sub& s = dynamic_cast<Sub&>(base_03); } catch (bad_cast) { cout << "cast to failed" << endl; } system("pause"); }
注:使用dynamic_cast转换时至少需要一个虚函数
原文:https://www.cnblogs.com/zsymdbk/p/14674415.html