1. 程式人生 > >基於C++的多態性動態判斷函數

基於C++的多態性動態判斷函數

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++的多態性動態判斷函數