基於C++的多態性動態判斷函數
阿新 • • 發佈:2017-07-08
ios int std highlight 分析 end 一段 father names
這裏先有一個問題:
問題描述:函數int getVertexCount(Shape * b)計算b的頂點數目,若b指向Shape類型,返回值為0;若b指向Triangle類型,返回值為3;若b指向Rectangle類型,返回值為4。
其中,Triangle和Rectangle均繼承於Shape類。
此問題的主函數已規定如下:
int main() { Shape s; cout << getVertexCount(&s) << endl; Triangle t; cout << getVertexCount(&t) << endl; Rectangle r; cout << getVertexCount(&r) << endl; }
分析:首先,問題要求的即類似與Java和C#中的反射機制,這裏我們考慮使用dynamic_cast函數,關於用法,我們先看一段函數:
//A is B‘s father void my_function(A* my_a) { B* my_b = dynamic_cast<B*>(my_a); if (my_b != nullptr) my_b->methodSpecificToB(); else std::cerr << " Object is not B type" << std::endl; }
只要對對象指針是否是nullptr即可判斷該對象運行是是哪個類的對象,全部代碼如下:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; class Shape{ public: Shape() {} virtual ~Shape() {} }; class Triangle : public Shape{ public: Triangle() {} ~Triangle() {} }; class Rectangle : public Shape { public: Rectangle() {} ~Rectangle() {} }; /*用dynamic_cast類型轉換操作符完成該函數計算b的頂點數目,若b指向Shape類型,返回值為0;若b指向Triangle類型,返回值為3;若b指向Rectangle類型,返回值為4。*/ int getVertexCount(Shape * b){ Triangle* my_triangle = dynamic_cast<Triangle*>(b); if (my_triangle != nullptr) { //說明是Triangle return 3; } Rectangle* my_Rectangle = dynamic_cast<Rectangle*>(b); if (my_Rectangle != nullptr) { //說明是Rectangle return 4; } return 0; } int main() { Shape s; cout << getVertexCount(&s) << endl; Triangle t; cout << getVertexCount(&t) << endl; Rectangle r; cout << getVertexCount(&r) << endl; }
基於C++的多態性動態判斷函數