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.抽象類
定義:包含一個或多個純虛函數的類
抽象類不能用來定義對象,但是它可以定義對象指針或對象引用,使用它們便可以實現動態聯編
抽象類在類的層次結構中,作為頂層或最上面幾層,由它作為一個類族的公共接口。反應該類族中各個類的共性