您好,登錄后才能下訂單哦!
在程序界,有句話是,程序好些,bug難調(diào)。
很多bug并不一點(diǎn)是邏輯錯(cuò)誤,而是一些細(xì)節(jié)問題。
我們分析下三個(gè)細(xì)節(jié)錯(cuò)誤引起的無法運(yùn)行問題:
//#define M_PI 3. 14159265358979323846 3.14中間有個(gè)空格
\t 寫成了\ t 有個(gè)空格
首先,創(chuàng)建了一個(gè)新類型CFigure。我們想創(chuàng)建一些具體的圖形(如,三角形、正方形或者圓),以及計(jì)算這些圖形周長和面積的方法。但是,我們并不知道具體的圖形是什么類型,所以無法用方法直接計(jì)算圖形的這些特性。這就是要把CFigure類創(chuàng)建為抽象類的原因。抽象類是至少聲明了一個(gè)虛方法的類,該虛方法沒有實(shí)現(xiàn),且其原型后面有=0。以這種方式聲明的函數(shù)叫做純虛函數(shù)。抽象類不能有對(duì)象,但是可以有繼承類。因此可以實(shí)例化抽象類的指針和引用,然后從CFigure類派生出CTriangle、CSquare和CCircle類,分別表示三角形、正方形和圓形。
我們要實(shí)例化這些對(duì)象的類型,所以在這些派生類中,實(shí)現(xiàn)了FigureType方法、Circumference方法和Area方法。雖然這3個(gè)類中的方法名都相同,但是它們的實(shí)現(xiàn)不同,這與覆蓋類似但含義不同。
如何理解?在本例的main函數(shù)中,聲明了一個(gè)數(shù)組,內(nèi)含3個(gè)CFigure類型的指針。作為指向基類的指針或引用,它們一定可以指向該基類的任何派生類。因此,可以創(chuàng)建一個(gè)CTriangle類型的對(duì)象,并設(shè)置CFigure類型的指針指向它,
CFigure* figures[3];
同理,用下面的代碼可以設(shè)置其他圖形:
figures[0] = new CTriangle(2.1,3.2,4.3); figures[1] = new CSquare(5.4,6.6); figures[2] = new CCircle(8.9);
現(xiàn)在,考慮下面的代碼:
for (int i = 0; i < 3; i++) { cout << "Figure type:\t" << figures[i]->FigureType(); cout<< "\nCircumference:\t" << figures[i]->Circumference(); cout<< "\nArea:\t\t" << figures[i]->Area(); cout<< endl << endl; }
編譯器將使用C++的動(dòng)態(tài)綁定(dynamicbinding)特性,確定圖形指針具體指向哪個(gè)類型的對(duì)象,調(diào)用合適的虛方法。只有把方法聲明為虛方法,且通過指針或引用訪問才能使用動(dòng)態(tài)綁定。
全部代碼如下,直接可以編譯運(yùn)行:
#include "stdafx.h" #include < iostream> #include <tchar.h> #define M_PI 3.14159265358979323846 using namespace std; //#define M_PI 3. 14159265358979323846 3.14中間有個(gè)空格 class CFigure //base class { public: virtual char* FigureType() = 0; virtual double Circumference() = 0; virtual double Area() = 0; virtual ~CFigure() { } }; class CTriangle : public CFigure //Derived Class { public: CTriangle() { a = b = c = 0; } CTriangle(double a, double b, double c) : a(a), b(b), c(c) { } virtual char* FigureType() { return "Triangle"; } virtual double Circumference() { return a + b + c; } virtual double Area() { double S = Circumference() / 2; return sqrt(S * (S - a) * (S - b) * (S - c)); } private: double a, b, c; }; class CSquare : public CFigure //Derived Class { public: CSquare() { a = 0.0; b = 0.0; } CSquare(double a, double b) : a(a), b(b) { } virtual char* FigureType() { return "Square"; } virtual double Circumference() { return 2 * a + 2 * b; } virtual double Area() { return a * b; } private: double a, b; }; class CCircle : public CFigure //Derived Class { private: double r; public: CCircle() { r = 0; } CCircle(double r) : r(r) { } virtual char* FigureType() { return "Circle"; } virtual double Circumference() { //return 2 * r * M_PI; double res = 0.00000000000000000000000; res = 2 * r * M_PI; //res = 2 * r * 3. 141592; return res; } virtual double Area() { double res = 0.000000000000000000000; res = 2 * r * M_PI; //res = 2 * r * 3. 14159265358979323846; return res; } }; int _tmain(int argc, _TCHAR* argv[]) { CFigure* figures[3]; figures[0] = new CTriangle(2.1,3.2,4.3); figures[1] = new CSquare(5.4,6.6); figures[2] = new CCircle(8.9); for (int i = 0; i < 3; i++) { cout << "Figure type:\t" << figures[i]->FigureType(); cout<< "\nCircumference:\t" << figures[i]->Circumference(); cout<< "\nArea:\t\t" << figures[i]->Area(); cout<< endl << endl; } getchar(); return 0; }
運(yùn)行結(jié)果:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。