动态联编与虚函数
来源:互联网 发布:张量与矩阵的乘积 编辑:程序博客网 时间: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
- C++虚函数与动态联编
- 动态联编与虚函数
- C++虚函数与动态联编
- 虚函数&动态联编
- 虚函数,静态联编与动态联编(读书笔记)
- C++中的虚函数与静态联编和动态联编
- 虚函数及静态联编与动态联编---学习笔记
- 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数
- C++ 虚函数、静态联编、动态联编
- C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
- C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
- 面向对象技术,多态,重载,静态联编与动态连编,虚函数,抽象类,虚析构函数
- 面向对象技术,多态,重载,静态联编与动态连编,虚函数,抽象类,虚析构函数
- 多态性之动态联编 虚函数
- 静态联编与动态联编
- 动态联编与静态联编
- 静态联编与动态联编
- 动态联编学习:三、虚函数表VTABLE
- NKOI 2422 植物大战僵尸[6月月赛题c]
- .NET应用程序调试:原理、工具、方法
- Android Design Support Library的使用
- json解析工具类
- DotNet 资源大全
- 动态联编与虚函数
- Linux下如何安装Discuz
- Java IO流分析整理
- oRTP分析
- 使用gem安装jekyll,提示无法下载:Broken pipe - SSL connection
- QVariant类
- universalimageloader加载本地图片(转载)
- Linux下搭建安装Discuz论坛
- iOS开发-图文混排之cell自适应