`
lianxiangbus
  • 浏览: 528905 次
文章分类
社区版块
存档分类
最新评论

C++ virtual关键字理解

 
阅读更多

在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关键的引入,可以理解为阻止编译阶段的静态绑定,将绑定(虚函数)和约束工作(虚基类)转移到运行时动态处理。

分享到:
评论

相关推荐

    深入理解c++中virtual关键字

    1.virtual关键字主要是什么作用?c++中的函数调用默认不适用动态绑定。要触发动态绑定,必须满足两个条件:第一,指定为虚函数;第二,通过基类类型的引用或指针调用。由此可见,virtual主要主要是实现动态绑定。 2....

    C++ Virtual关键字的具体使用

    基础理解和demo 普通的继承 #include class Parent { public: void print() { std::cout << "Parent" << std::endl; } }; class Child : Parent { public: void print() { std::cout << ...

    C++多态的实现机制深入理解

    1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3. ...

    传智播客_C++基础课程讲义_v1.0.7

    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++不可以,一个不带参数的C函数原型必须把void写出来。而C++...

    在MFC中用按钮控件演示多态性实例

    在MFC中用按钮控件演示多态性实例, 新建一个项目名称为A的MFC对话框应用程,在资源视图上拖一个按钮控件,程序运行后点击按按钮,比较一下若将CADlg基类virtual关键字去掉,或者派生类B中的display()改为其它再运行...

    在一小时内学会 C#(txt版本)

    本文特别适合有 C++ 基础却没有太多精力学习 C# 的读者。 关于作者 Aisha Ikram 我现在在英国一家软件公司任技术带头人。我是计算机科学的硕士。我主要使用 .NET 1.1/2.0, C#, VB.NET, ASP.NET, VC++ 6, MFC, ...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    java环境搭建.docx

    1.机器语言:由0和1组成可以被电脑理解。 2.汇编语言:由汇编软件把汇编语言翻译成机器语言 3.高级语言:由高级语言的编译器来把高级语言翻译成机器语言,然后计算机来运行。如:java,c,c++。 java语言的特点: ...

    c#学习笔记.txt

    virtual在派生类中声明其实现可由重写成员更改的方法或访问器。 volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列...

    【。net 专业】 面试题

    委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息...

Global site tag (gtag.js) - Google Analytics