最通俗易懂的C++继承与多态
C++继承与多态的讲解(爸爸与儿子关系)
小菜鸡也是一个普普通通的大学在读码农,对继承和多态有一些通俗易懂的讲解,希望能帮到大家,这是第一次尝试写博客以后也会经常写一些更好理解的C++的讲解。这里我采用去思考它存在的作用(好处)已经举例子更好的理解
1.总的流程
继承是用来继承类(基类,后边会讲),继承出来的就叫派生类。
多态指的是函数的多态,用来让函数更加的灵活,比如排序函数,让它在你需要从小到大排的时候,它能从小到大排,你让它从大到小排序的时候,它也可以在你需要的时候满足,这也就是多态(让一个函数可以在不同的情况下执行很多不同的功能)。
2.继承!爸爸与儿子的关系
比如,你创造了一个类,它用来储存人的各种属性,比如身高,年龄,体质,那么我们叫做它基类,为什么呢?你不论是老师,大人,小孩,学生都是人,它是这些具体人的一个基础:都为人!那么基类就会派生,什么意思呢,人又分为,老师,学生,程序员等等等,但它们有的属性都差不多,比如身高,体重这些都是有的。这些派生出来的类,就叫做派生类,你到这里就大概可以想象,爸爸是植物这个大类,比如花和草都属于植物的具体的一个情况。
基类就相当于是一个笼统的概念,而派生类,就是这个笼统的概念的一些具体情况,上述举过例子
3.(虚)函数的多态(定义了一个Shape基类,及笼统的表示图形)
正如基类和派生,是笼统到具体,虚函数也是,虚函数在基类里面定义,它只是告诉你有了这个函数,比如我定义在基类的函数(这种函数叫虚函数,虚的),Square()我想让它来求Shape的面积,然而这个求面积,比如圆是πR^2,矩形是ab(长乘以宽),没有具体这个Square函数的内容。
基类里有虚函数,派生类里去定义虚函数的内容,就相当于,基类和虚函数,都是一个大概念而已,而派生类和派生类里面用虚函数就是详细具体的情况。
4.实战,举个具体的列子
创建基类,基类里写入虚函数
class Shape { //一个大的概念,图形类
public:
virtual void shuru()=0; //输入图形的一些参数
virtual double Square()=0; //求图形的面积函数
virtual double Circumference()=0; //求图形周长函数
};
5.派生列,具体派生了矩形和圆形
矩形类
class Rectangle :public Shape { //矩形继承类,一个具体的图形了
double x1, y1, x2, y2;
public:
Rectangle(){ //用构造函数初始化
x1 = 0; y1 = 0;
x2 = 0; y2 = 0;
}
//这下边三个函数都是,虚函数的具体使用
virtual void shuru() { //给矩形类的一些参数输入具体数据
cout << "请输入矩形的左上角点和右下角点" << endl;
cout << "x1=";
cin >> x1;
cout << "y1=";
cin >> y1;
cout << "x2=";
cin >> x2;
cout << "y2=";
cin >> y2;
}
virtual double Square(){ //求面积
cout << "面积是" << endl;
cout << (x2 - x1) * (y1 - y2) << endl;
return (x2 - x1) * (y1 - y2);
}
virtual double Circumference() { //求周长
cout << "周长是" << endl;
cout << 2 * (x2 - x1) + 2 * (y1 - y2) << endl;
return 2 * (x2 - x1) + 2 * (y1 - y2);
}
};
圆类
class Circle :public Shape { //圆类继承类,具体的情况了
double x, y, r;
public:
Circle() { //用构造函数初始化
x = 0;
y = 0;
r = 0;
}
virtual void shuru() { //这下边三个函数都是,虚函数的具体使用
cout << "请输入圆心坐标和半径ovo" << endl;
cout << "x=";
cin >> x;
cout << "y=";
cin >> y;
cout << "r=";
cin >> r;
cout << "圆心坐标为:(" << x << "," << y << ")" << endl;
}
virtual double Square() {
cout << "面积是" << endl;
double s;
s = pi * r * r;
printf("%.6f\n", s); //保留六位小数
return pi * r * r;
}
virtual double Circumference()
{
cout << "周长是" << endl;
double c;
c = 2 * pi * r;
printf("%.6f\n", c); //保留六位小数
return 2 * pi * r;
}
};
如何去主函数调用派生类和函数
用指针来使用这些函数
int main() {
Rectangle l1;
Circle l2; //类实体化
Shape* p; //指针
p = &l1;
p->shuru();
p->Square();
p->Circumference();
p = &l2;
p->shuru();
p->Square();
p->Circumference();
return 0;
}
~博客里有配合的代码,免费下载~
一个小菜鸡~