[C++]多态和构造顺序

一道C++多态的题目,考察多态和构造顺序的。求输出结果:
#include <iostream>
#include
<vector>

class Base
{
public
:
      Base(){ cout
<<"Base::Base()"<<
endl; virt(); }
    
virtual void virt() { cout<<"Base::virt()"<<
endl; }
    
void func(){ cout<<"Base::func()"<<
endl; }
};

class Derived : public
Base
{
public
:
      Derived(){ cout
<<"Derived::Derived()"<<
endl; virt(); }
    
virtual void virt() { cout<<"Derived::virt()"<<
endl; }
    
void func() { cout<<"Derived::func()"<<
endl; }
};

int
main(){

      Derived d;
      Base
*pb = &
d;
      pb
->
func();
      pb
->
virt();

    
return 0
;
}

分析:

首先基类和派生类的函数分为两种,一种是虚函数,一种是非虚函数。

关于多态。那么两种函数的区别在于虚函数是动态绑定的,非虚函数是静态绑定的。基类指针pb的静态类型是Base,动态类型是Derived,那么调用静态绑定的函数当然是符合其静态类型。

关于构造顺序。无需多说,当然是先构造基类,然后构造派生类。

至于深层次的原因和虚函数virt()的调用,那需要《深入探索C++对象模型》。。。在基类的构造函数中调用virt(),因为此时派生类的对象还没开始构造呢,所以只有基类对象存在,因此调用virt()函数只能是调用基类的版本。但是当调用了派生类的构造函数之后,派生类的对象就存在了,这个时候再调用虚函数,将得到派生类的版本。

这是因为两条原则:

构造函数的函数体(或构造函数所调用的函数)能可靠地访问基类中声明的数据成员和/或构造函数所属类声明的数据成员。这是因为所有这些数据成员被保证在构造函数函数体开始执行时已经被完整的建立。

在基类的构造函数执行期间,
对象还不是一个派生类的对象

所以输出结果就是:

Base::Base()
Base::virt()
Derived::Derived()
Derived::virt()
Base::func()
Derived::virt()





转载于:https://www.cnblogs.com/microgrape/archive/2011/05/11/2043770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值