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++虚函数调用机制初探

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

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

对于C++中经常出现的函数名称相同但是参数列表或者返回值不

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

声明了一个父类一个子类。 class father { public: father(); ~father(); virtual int getAge(); private: int m_a...

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

转自:http://blog.csdn.net/apemancsdn/article/details/82606 虚函数的调用如何能实现其“虚”?作为C++多态的表现手段,估计很多人对其...

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

#include class Base { public: virtual void print(){ printf("Base::print()\n");} void print2(){} ...

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

在JAVA中,如果在构造函数中调用虚拟函数的话,是可以编译通过的,也不会出现运行期错误,但他的运行结果也许不是你想要的。在JAVA当中,由于是运行期绑定,而构造函数执行的虚拟函数将是衍生类中的函数(假...

C++ 普通函数和虚函数调用的区别

http://www.cnblogs.com/likui360/p/6369915.html 引出:写个类A,声明类A指针指向NULL,调用类A的方法会有什么后果,编译通过吗,运行会通过吗?...

C++从虚函数表的底层来看虚函数调用问题

原本以为自己对虚函数掌握的还可以,结果前几天面试的时候被问了一个构造和析构函数里调用虚函数的问题,结果就给答错了。...

C++继承类和基类之间成员函数和虚函数调用机制

今天去参加百度的面试,遇到一个关于虚函数的机制的问题,我一直认为就是为了让基类指针或引用(指向继承类)能够看到基类的虚函数(当基类的虚函数没有被继承类重写),但是继承类又怎么看到基类的普通成员函数呢?...

C++构造函数调用虚函数的问题

环境:XPSP3 VS2005         今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { pu...
  • zhu2695
  • zhu2695
  • 2013年07月25日 12:16
  • 587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++与C#关于虚函数调用的一点比较
举报原因:
原因补充:

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