C++与C#关于虚函数调用的一点比较

原创 2006年05月24日 11:20:00

在C++FAQ上看到一个关于虚函数的重载说明,原贴内容如下:

[23.3] 当基类构造函数调用虚函数时,为什么不调用派生类重写的该虚函数?

当基类被构造时,对象还不是一个派生类的对象,所以如果 Base::Base()调用了虚函数 virt(),则 Base::virt() 将被调用,即使 Derived::virt()(译注:即派生类重写的虚函数)存在。

同样,当基类被析构时,对象已经不再是一个派生类对象了,所以如果 Base::~Base()调用了virt(),则 Base::virt()得到控制权,而不是重写的 Derived::virt()

当你可以想象到如果 Derived::virt() 涉及到派生类的某个成员对象将造成的灾难的时候,你很快就能看到这种方法的明智。详细来说,如果 Base::Base()调用了虚函数 virt(),这个规则使得 Base::virt()被调用。如果不按照这个规则,Derived::virt()将在派生对象的派生部分被构造之前被调用,此时属于派生对象的派生部分的某个成员对象还没有被构造,而 Derived::virt()却能够访问它。这将是灾难。

意思是说在C++中,如果基类的构造函数中调用它定义的的虚函数,即使在派生类中对这个虚函数进行了重写,实际运行中调用的仍是基类的版本。具体原因可以参见上面的说明,大概意思是在基类的构造函数中,子类对象还未被构造出来,所以这个时候调用的仍是基类的。

但是在C#中,同样的情况,基类中调用的却是派生类重写后的版本。我在本机是试过,运行结果是这样的,但是不是太明白为什么。

C++ 之 浮点数的大小比较

本文首先 将 介绍 浮点数 的 存储结构 以及 (int&) 操作 含义。其次,介绍 常规 浮点数比较 方法。最后 本文,将采用 (int&) 转换为 整型 数据 ,直接比较 转换为的 整形数据 的...
  • u013630349
  • u013630349
  • 2015年04月08日 21:46
  • 2962

深入理解C++浮点数(float、double)类型数据比较、相等判断

浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基...
  • cbNotes
  • cbNotes
  • 2014年08月29日 10:12
  • 17560

判断两个float变量是否相等以及和 0 值比较方法

float 型: 占 4 字节,7 位有效数字 double 型:占 8 字节,15~16 位有效数字 浮点数的表示是不精确的,float 和 double 都不能保证可以...
  • zy986718042
  • zy986718042
  • 2017年05月24日 22:03
  • 1874

C++虚函数调用机制初探

  • 2007年11月08日 21:45
  • 32KB
  • 下载

有图有真相带你理解C++中虚函数调用机制

高手请绕道,本文献给初学者。有图有真相 一、虚函数         在面向对象的高级语言中,实现多态机制,必不可少的重要一部分就是虚函数。在C++中,当一个类中含有virtual修饰的成员函数时,这...
  • ndl1302732
  • ndl1302732
  • 2017年07月15日 13:50
  • 171

C++虚函数调用的反汇编解析

转自:http://blog.csdn.net/apemancsdn/article/details/82606 虚函数的调用如何能实现其“虚”?作为C++多态的表现手段,估计很多人对其...
  • jphaoren
  • jphaoren
  • 2011年11月10日 15:57
  • 579

从汇编角度理解C++虚函数调用机制

#include class Base { public: virtual void print(){ printf("Base::print()\n");} void print2(){} ...
  • lyq240919525
  • lyq240919525
  • 2014年10月15日 13:54
  • 435

C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用机制【个人总结】

对于C++中经常出现的函数名称相同但是参数列表或者返回值不
  • loveRooney
  • loveRooney
  • 2014年07月30日 22:49
  • 4376

c++中类的大小和虚函数调用顺序

声明了一个父类一个子类。 class father { public: father(); ~father(); virtual int getAge(); private: int m_a...
  • viperlong
  • viperlong
  • 2013年06月03日 17:53
  • 404

[转载]分析C++方式构造函数调用虚函数的问题

在JAVA中,如果在构造函数中调用虚拟函数的话,是可以编译通过的,也不会出现运行期错误,但他的运行结果也许不是你想要的。在JAVA当中,由于是运行期绑定,而构造函数执行的虚拟函数将是衍生类中的函数(假...
  • liocveeI
  • liocveeI
  • 2012年06月20日 13:48
  • 258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++与C#关于虚函数调用的一点比较
举报原因:
原因补充:

(最多只允许输入30个字)