-----------------------------------------警记---------------------------------------------
//创建一个形状类Shape,包含纯虚函数area,派生出Circle类及Rectangle类,通过一个total函数求其二者的和
#include
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 };
二者的内存地址在一段连续的区域
基类指针的定义形式:(唯一?)
基类名 *指针名 [指针个数] ={&派生类对象,&... };
或者
指针名 *指针名 [指针个数];
指针名 [-] = &对象;
...
无法使用动态分配基类指针(无法建立对象无法动态分配)
--------------------------------------------面壁思过--------------------------------------