静态联编和动态联编

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.抽象类

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

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

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

原文地址:https://www.cnblogs.com/syyy/p/6156082.html