zoukankan      html  css  js  c++  java
  • 静态联编和动态联编

    1.联编是指对于相同名字的若干个函数的选择问题

    2.实例

    #include <iostream>
    using namespace std;
    const double PI = 3.1415926;
    
    
    class Point
    {
    private:
        double x,y;
    public:
        Point(double i,double j)
        {
            x = i;
            y = j;
        }
        double Area()
        {
            return 0;
        }
    };
    class Rectangle:public Point//矩形类
    {
    private:
        double w,h;
    public:
        Rectangle(double i,double j,double k,double l):Point(i,j)
        {
            w = k;
            h = l;
        }
        double Area()
        {
            return w * h;
        }
    };
    
    class Circle:public Point//圆类
    {
    private:
        double r;
    public:
        Circle(double i,double j,double k):Point(i,j)
        {
            r = k;
        }
        double Area()
        {
            return PI * r * r;
        }
    };
    
    void fun(Point &p)
    {
        cout << "Area=" << p.Area() << endl;
    }
    
    int main()
    {
        Rectangle r(3.5, 4, 5.2, 6.6);
        Circle c(4.5,6.2,5);
        fun(r);
        fun(c);
    
        return 0;
    }
    
    //输出
    //Area = 0
    //Area = 0

    p是Point类的对象,由于没有虚函数,实行静态联编(在编译时进行选择),选择的是Point中的Area函数

    #include <iostream>
    using namespace std;
    const double PI = 3.1415926;
    
    
    class Point
    {
    private:
        double x,y;
    public:
        Point(double i,double j)
        {
            x = i;
            y = j;
        }
        double Area()
        {
            return 0;
        }
    };
    class Rectangle:public Point//矩形类
    {
    private:
        double w,h;
    public:
        Rectangle(double i,double j,double k,double l):Point(i,j)
        {
            w = k;
            h = l;
        }
        double Area()
        {
            return w * h;
        }
    };
    
    class Circle:public Point//圆类
    {
    private:
        double r;
    public:
        Circle(double i,double j,double k):Point(i,j)
        {
            r = k;
        }
        virtual double Area()
        {
            return PI * r * r;
        }
    };
    
    void fun(Point &p)
    {
        cout << "Area=" << p.Area() << endl;
    }
    
    int main()
    {
        Rectangle r(3.5, 4, 5.2, 6.6);
        Circle c(4.5,6.2,5);
        fun(r);
        fun(c);
    
        return 0;
    }
    
    //输出
    //Area = 34.32
    //Area = 78.5398

    在Point类中的Area()函数前加了virtual,使其变成了虚函数,实现了动态联编,调用对象r、c类中的Area函数

    3.虚函数

      1)在公有继承方式下,可以通过基类对象指针或引用来调用基类的同名函数。

        在静态联编中,如果用基类指针指向派生类对象,也无法去调用派生类的同名成员函数,

        在动态联编中,如果这同名函数是虚函数时,基类对象指针指向了派生类对象后,便可以调用派生类的同名函数

      2)说明方法

        virtual int A();

      虚函数一定是成员函数(但不能是静态成员函数)

      虚函数定义在类体外时不加virtual

      3)实现动态联编的方法

      通过对象指针或引用访问虚函数

      通过成员函数实现动态联编

      4)虚函数的继承性

      在基类中说明的虚函数,在派生类中函数说明完全相同的函数为虚函数,在派生类中可以加关键字virtual,也可以不加

    4.虚析构函数

    构造函数不能说明为虚函数

    虚析构函数的作用在于系统将采用动态联编调用析构函数,使析构更彻底 

     定义:virtual ~A()

          {}

    5.纯虚函数

      1)定义:virtual int A () = 0;

      2)纯虚函数没有函数体

      3)纯虚函数不能被调用,只有在派生类中被具体定义后才能被调用

    6.抽象类

      定义:包含一个或多个纯虚函数的类

      抽象类不能用来定义对象,但是它可以定义对象指针或对象引用,使用它们便可以实现动态联编

      抽象类在类的层次结构中,作为顶层或最上面几层,由它作为一个类族的公共接口。反应该类族中各个类的共性

  • 相关阅读:
    Matlab 整数线性规划问题模型代码
    Matlab 非线性规划问题模型代码
    Matlab 线性规划问题模型代码
    多波次导弹发射中的规划问题(二) 问题一解答
    多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
    多无人机对组网雷达的协同干扰问题 数学建模
    余胜威《MATLAB数学建模经典案例实战》2015年版
    袁新生《LINGO和Excel在数学建模中的应用》
    卓金武《MATLAB在数学建模中的应用》 第2版
    司守奎《数学建模算法与应用》 第二版
  • 原文地址:https://www.cnblogs.com/syyy/p/6156082.html
Copyright © 2011-2022 走看看