静态联编和动态联编
Posted farmerspring
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态联编和动态联编相关的知识,希望对你有一定的参考价值。
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.抽象类
定义:包含一个或多个纯虚函数的类
抽象类不能用来定义对象,但是它可以定义对象指针或对象引用,使用它们便可以实现动态联编
抽象类在类的层次结构中,作为顶层或最上面几层,由它作为一个类族的公共接口。反应该类族中各个类的共性
以上是关于静态联编和动态联编的主要内容,如果未能解决你的问题,请参考以下文章