动态联编与虚函数

来源:互联网 发布:张量与矩阵的乘积 编辑:程序博客网 时间:2024/05/27 00:28

程序中若出现函数调用,但在编译阶段无法确定调用哪个函数,而只有到了程序运行的时候才能确定哪个函数,这就是 动态联编,又称 滞后联编,晚期联编。

c++中实现动态联编技术,是通过虚函数从而实现动态多态。

虚函数 的 定义和 使用 : 在类内  : virtual + <数据类型> + <函数名> (参数列表)

使用虚函数的 几点说明:

1.当基类中的成员函数是虚函数是,在其派生类中的虚函数 必须与 基类的虚函数 同名,且函数参数的个数,类型完全一致,否则属于函数重载。

2.基类中的 虚函数不能缺省关键字 virtual , 而其派生类中的虚函数可以 缺省virtual。

3.动态多态 必须 通过 基类对象的引用 基类对象的指针调用虚函数 才能实现。如:

double Area(Point *p){     return(p->Area());}void main(){    Point(1,2);Rectangle r(0,0,1,1);Circle c(0,0,1);cout << Area(&p) << Area(&r)<< Area(&c) << endl;}

4. 虚函数不能是 友元函数, 因为虚函数是 成员函数,友元不是。虚函数不能是 静态成员函数,因为静态成员函数属于类,与具体对象无关。 虚函数不能是 内联函数,因为内联函数是在 编译时刻 调用处理; 而虚函数实在 运行时刻决定 调用哪个函数。 构造函数不能 定义为 虚函数,但析构函数可定义为 虚函数。

5.虚函数 与 一般函数相比,调用执行速度要慢一些。因为,为了实现动态联编,编译器要为每一个含有虚函数的 对象增加指向 虚函数地址表 的 指针,通过该指针实现虚函数的间接调用。因此除非要编写一些通用程序并且 必须使用虚函数才能完成其功能的情况外,一般不要使用虚函数。

#include <iostream>using namespace std;class A {public:virtual void fun1() {cout << "A:fun1" << '\t';fun2();}void fun2() {cout << "A:fun2" << '\t';fun3();}virtual void fun3() {cout << "A:fun3" << '\t';fun4();}void fun4() { cout << "A:fun4" << '\n'; }};class B :public A {public:void fun3() {cout << "B:fun3" << '\t';fun4();}void fun4() {cout << "B:fun4" << '\n';}};void main() {A a;B b;a.fun1();b.fun1();}



0 0
原创粉丝点击