C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

静态联遍

C++支持两种多态性,即编译时的多态性和运行时的多态性。前者是指编译结束后,程序就知道了具体调用哪个函数,例如知道调用父类的函数还是调用子类的函数。后者是直到运行时,程序才知道该调用父类的函数还是子类中重载的该函数。前者叫做静态联遍,后者就叫做动态联遍。看一个例子:

#include <iostream>
using namespace std;
class Rectangle
{
    public:
        //构造函数
        Rectangle(double a,double b){h=a;w=b;}
        double area(){return h\*w;}
    private:
        double h,w;
};
class Circle:public Rectangle
{
    public:
        //构造函数
        Circle(double a,double b,double c):Rectangle(a,b){r=c;}
        double area(){return 3.14\*r\*r;}
    private:
        double r;
};
void func(Rectangle &rec)
{
    cout<<rec.area()<<endl;
}
void main()
{
    Rectangle r1(2,3);
    Circle c1(4,5,1);
    func(r1);
    func(c1);
}

上面父类Rectangle,有宽w、高h两个数据成员,还有一个算面积的成员函数。子类Circle继承自父类Rectangle,并且有自己的新的数据成员半径r,并重定义了算面积的函数。还有一个不属于任何类的函数func,接收Rectangle对象的引用,输出面积。

在main函数中,定义Rectangle对象r1,Circle对象c1,并依次作为函数func的参数进行调用,输出为:

6

20

对于第一行输出没有疑问,长乘以宽。对于二行,我们理想的情况是调用Circle类重定义的函数func,却仍调用的是父类的func实现。这是因为静态联遍,在编译完之后,程序就确定了要去执行Rectangle类的area函数