標籤:ecif log dynamic 返回 func 一個 rtu amp nullptr
這裡先有一個問題:
問題描述:函數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 fathervoid 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類型轉換操作符完成該Function Computeb的頂點數目,若b指向Shape類型,傳回值為0;若b指向Triangle類型,傳回值為3;若b指向Rectangle類型,傳回值為4。*/int getVertexCount(Shape * b){Triangle* my_triangle = dynamic_cast<Triangle*>(b);if (my_triangle != nullptr){//說明是Trianglereturn 3;}Rectangle* my_Rectangle = dynamic_cast<Rectangle*>(b);if (my_Rectangle != nullptr){//說明是Rectanglereturn 4;}return 0;}int main() {Shape s;cout << getVertexCount(&s) << endl;Triangle t;cout << getVertexCount(&t) << endl;Rectangle r;cout << getVertexCount(&r) << endl;}
基於C++的多態性動態判斷函數