虚函数

1。纯虚函数应该注意的: 
  纯虚函数在子类中必须重新定义, 但它可以有自己的定义。
  例如:
  class Base
  {
  public:
   virtual void print() = 0
   {
   printf("Yes, this is default print.\n");
   }
   virtual ~Base() = 0{}
  };
  class Derived : public Base
  {
  public:
   void print()
   {
   printf("Yes, this is sub print.\n");
   }
   ~Derived(){}
  };
  要调用纯虚函数的定义 Base::print(). 意义:1。 可以定义默认的操作, 类似非纯虚函数, 有可以避免加入新子类的时候的,错用默认操作的问题。
  
  纯虚析构函数是一定需要定义的。 
   Base* pB = new Derived;
   delete pB;
  
  析构过程 : 1. ~Derived() 2. ~Base(). 所以如果没有给~Base定义的话, 编译器link 的时候会出错。
  
  2。不要重新定义继承而来的非虚拟函数。
  
  Reason: 
   1。 基类的纯虚函数,是让子类只继承接口, 必须实现该接口。 一般纯虚函数, 是让子类继承接口以及实现,并允许修改该实现。 非虚函数是让子类继承接口并实现。所以如果重新定义该函数,就违背了设计初衷。因为新定义的非虚拟函数是会遮蔽基类的非虚函数的。
   2。 用基类指针指向子类对象, 和用子类对象指向该对象的非虚函数, 如果该非虚函数被重新定义的话, 就会出现不同的行为, 与 子类对象 是 基类对象就不为真。 (不变性凌驾于变异性之上。)
  
  3。理解动态和静态的区别, 不要重新定义在继承而来的缺省参数。
  
  缺省参数是静态绑定的, 而虚函数是动态绑定的, 如果基类的虚函数中你定义缺省参数,而子类重定义该虚函数时重新定义了该缺省参数的话, 就会出现,用基类指针指向子类对象的时候调用该虚函数用的是基类的缺省参数, 而用子类指针指向子类对象的时候调用该函数,用的是子类的缺省参数。
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值