-----------------------------------------警記---------------------------------------------
//創建一個形狀類Shape,包含純虛函數area,派生出Circle類及Rectangle類,通過一個total函數求其二者的和
#include<iostream>
using namespace std;
const double pi = 4 * atan(1.0);
class Shape
{
public:
virtual double area() = 0;
};
class Circle :public Shape
{
private:
double radius;
public:
Circle(double r) :radius(r) {}
double area() {
return pi * radius * radius;
}
};
class Rectangle :public Shape
{
private:
double length;
double width;
public:
Rectangle(double l,double w):length(l),width(w){}
double area() {
return length * width;
}
};
double total(Shape *shape[], int num) {
double tot = 0;
for (int i = 0; i < num; i++) {
tot += shape[i]->area();
}
return tot;
}
int main()
{
Circle cir(2);
cout << cir.area() << endl;
Rectangle rec(3, 2);
cout << rec.area() << endl;
Shape *p[2] = { &cir,&rec }; //p[0] = &cir, p[1] = &rec;
cout << total(p, 2) << endl;
return 0;
}
如果基類爲抽象類,是無法創建對象,即無法用一維指針創建一個連續內存空間的。
抽象類:其類中至少有一個純虛函數或者其父類有純虛函數而在其本身未實現相應功能的類爲抽象類。抽象類因爲未實現相應的功能,不能創建相應的對象,但是可以創建一維指針指向其派生類,實現多態性。
單純一個派生類的對象,通過基類的一維指針即可進行操作。
Shape *shape1 = & cir ;
Shape *shape2 = & rec ;
//shape1和shape2二者的地址在不同的位置
如果要操作不同派生類的對象,可以通過創建二維的基類指針存放連續的內存空間。
Shape *shape[2] = { &cir, &rec };
二者的內存地址在一段連續的區域
基類指針的定義形式:(唯一?)
基類名 *指針名 [指針個數] ={&派生類對象,&... };
或者
指針名 *指針名 [指針個數];
指針名 [-] = &對象;
...
無法使用動態分配基類指針(無法建立對象無法動態分配)
--------------------------------------------面壁思過--------------------------------------