1、采用VC6用MFC AppWizard生成windows單檔案界面;
2、分析生成的代碼里有幾些類是派生的,分別是從什么類派生?
3、添加一個新基類
class Shape
{
public:
virtual void draw() = 0;
//其他虛函式
};
在此基礎上設計直線、矩形框、橢圓的派生類,并給這些派生類設計相關的資料成員和成員函式和虛函式draw。
4、在選單和按鈕上添加代碼實作畫直線、矩形框、橢圓,比如點直線按鈕,就在螢屏上畫一條直線,畫圖的代碼要求放在OnDraw。
uj5u.com熱心網友回復:
參考這個吧問題的要求是:定義一個Shape基類,然后定義它的派生類 Circle、Rectangle 、
Triangle,要求每個派生類有輸出面積的函式,指定在實作中要使用C++的多型。
我是這樣思考這個問題的。
一、定義Shape類
首先,一個圖形類,一定會涉及把這個圖形畫出來。要畫出來
就要考慮這個圖形在哪兒畫,所以我們應該為圖形類定義一個Point型別的center成員,
來定為圖形。由于每類圖形的畫法不同所以,需要派生類實作自己的派生類,這里就只定義一個
純虛函式來要求它的派生類重新實作該函式。virtual void paint() const = 0;
其次,圖形有面積,需要輸出圖形的面積。要輸出面積,就要求出面積,但是每個圖形類的
求面積方法不同,所以我們定義一個 void printArea() const;用來輸出圖形面積。
定義一個純虛函式 virtual float area()=0;來禁止定義Shape類的物件,并要求它的派
生類重新實作這個函式;
這樣,我們就定義出了Sharp類。
class Shape
{
public:
Shape( const Point &c = Point() ):center(c){}
virtual void paint() const = 0;
void printArea() const
{
cout << area();
}
protected:
virtual float area() const = 0; //純虛函式
private:
Point center; //保存圖形的中心點
};
二、定義Circle類
我們從Sharp類派生Circle類的話,只需要實作自己的求面積函式和畫圖形函式以及建構式。
首先:要實作上面的那些函式,需要給Circle類增加新的資料成員:半徑。于是我們增加一個
float radius; 資料成員。
其次:實作建構式需要:1、定義給radius資料成員的初始化 2、給基類建構式傳遞基類
建構式引數來初始化從基類派生而來的資料成員。
然后:實作求面積的成員函式。
最后:實作畫圖形的成員函式,這里只給出函式的宣告。
這樣就定義除了Circle類了
circle.h
class Circle:public Shape
{
public:
Circle( float r = 0.0 ):radius(r){}
Circle( const Point &c, float r ):Shape(c),radius(r){}
void paint() const;
protected:
float area() const;
private:
float radius;
static const float pi = 3.14F;
};
circle.cpp
const float Circle::pi;
float Circle::area() const
{
return pi*radius*radius;
}
void Circle::paint() const
{
……
}
其他類的實作和Circle類類似。
當我們實作了這些類以后,我們如何用到C++中的多型呢?
C++的多型是通過基類的參考和基類的指標來實作的。我們定義下面的函式就用到了C++的多型
了。
int main()
{
Shape *shape;
Circle circle(10);
Rectangle rectangle(2,2);
shape = &circle;
shape.printArea();
shape = &rectangle;
shape.printArea();
return 0;
}
程式輸出的結果是:314 4
通過這個程式可以看出,我們從已知類派生新類時,若不增加新功能時則只需要實作建構式和
虛函式。如果要實作新的功能時,例如實作圖形的旋轉指定角度。則需要定義新的成員函式,以
及實作該函式的成員變數。
uj5u.com熱心網友回復:
關注一下轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110084.html
標籤:基礎類
