1、多态(polymorphism)
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape(int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() { //加上virtual表示虚函数,告诉编译器不要链接到该函数
cout << "Parent class Area:" << endl;
return 0;
}
// 也可在基类中定义纯虚函数,如下所示,虚函数声明时必须=0
// virtual int area()=0;
};
class Rectangle : public Shape { // 矩形
public :
Rectangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Rectangle class area:" << endl;
return (width * height);
}
};
class Triangle : public Shape { //三角形
public:
Triangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Triangle class area :" << endl;
return (width * height / 2);
}
};
int main() {
Shape *shape;
Rectangle rec(10, 7);
Triangle tri(10, 5);
由于shape基类中也有area函数,所以会输出Parent class Area:,这样得到的是基类中得area
这就是静态多态或者是静态链接,函数在程序执行之前就准备好了,也被称之为早绑定
此时只需要在前面加上virtual即可避免这种现象
// 指向矩形
shape = &rec;
shape->area();
// 指向三角形
shape = &tri;
shape->area();
return 0;
}
2、数据抽象(Data Abstraction)
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape(int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() { //加上virtual表示虚函数,告诉编译器不要链接到该函数
cout << "Parent class Area:" << endl;
return 0;
}
// 也可在基类中定义纯虚函数,如下所示,虚函数声明时必须=0
// virtual int area()=0;
};
class Rectangle : public Shape { // 矩形
public :
Rectangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Rectangle class area:" << endl;
return (width * height);
}
};
class Triangle : public Shape { //三角形
public:
Triangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Triangle class area :" << endl;
return (width * height / 2);
}
};
int main() {
Shape *shape;
Rectangle rec(10, 7);
Triangle tri(10, 5);
由于shape基类中也有area函数,所以会输出Parent class Area:,这样得到的是基类中得area
这就是静态多态或者是静态链接,函数在程序执行之前就准备好了,也被称之为早绑定
此时只需要在前面加上virtual即可避免这种现象
// 指向矩形
shape = &rec;
shape->area();
// 指向三角形
shape = &tri;
shape->area();
return 0;
}
3、数据封装(Data Encapsulation)
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape(int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() { //加上virtual表示虚函数,告诉编译器不要链接到该函数
cout << "Parent class Area:" << endl;
return 0;
}
// 也可在基类中定义纯虚函数,如下所示,虚函数声明时必须=0
// virtual int area()=0;
};
class Rectangle : public Shape { // 矩形
public :
Rectangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Rectangle class area:" << endl;
return (width * height);
}
};
class Triangle : public Shape { //三角形
public:
Triangle(int a = 0, int b = 0) : Shape(a, b) {}
int area() {
cout << "Triangle class area :" << endl;
return (width * height / 2);
}
};
int main() {
Shape *shape;
Rectangle rec(10, 7);
Triangle tri(10, 5);
由于shape基类中也有area函数,所以会输出Parent class Area:,这样得到的是基类中得area
这就是静态多态或者是静态链接,函数在程序执行之前就准备好了,也被称之为早绑定
此时只需要在前面加上virtual即可避免这种现象
// 指向矩形
shape = &rec;
shape->area();
// 指向三角形
shape = &tri;
shape->area();
return 0;
}