靜態聯編和動態聯編


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

  定義:包含一個或多個純虛函數的類

  抽象類不能用來定義對象,但是它可以定義對象指針或對象引用,使用它們便可以實現動態聯編

  抽象類在類的層次結構中,作為頂層或最上面幾層,由它作為一個類族的公共接口。反應該類族中各個類的共性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM