在c++语言中,从代码到程序的运行,要经历编译和连接,针对这两个不同的阶段,c++设计了不同的机制,其中vitual和inline就是区分编译器工作和链接器工作的标志;
inline很容易理解,生命为inline的函数在编译阶段即被展开成代码,而非inline的函数采用运行时链接的方式处理;
vitual关键字,我只在这里谈三个地方的用途:
1、vitual基类
在多重继承中,从派生类到基类存在多条路线时(多个继承脉络或者途径),一个这种派生类的对象实例化将包含多个基类对象,浪费资源且调用混乱的现象出现。因此引入了vitual baseclass,来在运行阶段克服多个基类对象的产生。这个vitual是在运行阶段保证对象唯一性的。
2.vitual函数
虚函数的出现,是由于基类的指针可以执行派生类,因此引出了不便,如
class deriv:public class base
{
public:
void show();
}
当
deriv d;
base* b;
b=&d;
b->show();
这里的show应该调用谁的呢?我们的意思肯定是调用d的,但是编译器处理的话b和base类是绑定在一起的,他实际上是会调用b的show函数。
因此,我们引入vitual函数,来告诉编译器,出现这种情况时,在运行时动态链接进行处理。
3.vitual在纯虚函数中使用
纯虚函数完全是为了继承体系的完整,也是集成vitual函数的作用而产生的。代表了编译器阶段对象的绑定,将调用选择转移到运行时动态绑定。
综上:vitual关键的引入,可以理解为阻止编译阶段的静态绑定,将绑定(虚函数)和约束工作(虚基类)转移到运行时动态处理。
分享到:
相关推荐
1.virtual关键字主要是什么作用?c++中的函数调用默认不适用动态绑定。要触发动态绑定,必须满足两个条件:第一,指定为虚函数;第二,通过基类类型的引用或指针调用。由此可见,virtual主要主要是实现动态绑定。 2....
基础理解和demo 普通的继承 #include class Parent { public: void print() { std::cout << "Parent" << std::endl; } }; class Child : Parent { public: void print() { std::cout << ...
1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3. ...
1、 C++对C的扩展 1 1简单的C++程序 1 1.1求圆的周长和面积 1 1.2初学者易犯错误模型 3 2程序设计方法的发展历程 4 3 C语言和C++语言关系 6 4 C++对C的加强 6 4.1 namespace命名空间 6 4.2 “实用性”增加 6 4.3 ...
这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...
在MFC中用按钮控件演示多态性实例, 新建一个项目名称为A的MFC对话框应用程,在资源视图上拖一个按钮控件,程序运行后点击按按钮,比较一下若将CADlg基类virtual关键字去掉,或者派生类B中的display()改为其它再运行...
本文特别适合有 C++ 基础却没有太多精力学习 C# 的读者。 关于作者 Aisha Ikram 我现在在英国一家软件公司任技术带头人。我是计算机科学的硕士。我主要使用 .NET 1.1/2.0, C#, VB.NET, ASP.NET, VC++ 6, MFC, ...
无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...
1.机器语言:由0和1组成可以被电脑理解。 2.汇编语言:由汇编软件把汇编语言翻译成机器语言 3.高级语言:由高级语言的编译器来把高级语言翻译成机器语言,然后计算机来运行。如:java,c,c++。 java语言的特点: ...
virtual在派生类中声明其实现可由重写成员更改的方法或访问器。 volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列...
委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息...