动态联编与虚函数

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

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();
}



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值