• 【M25】将构造方法和非成员方法虚化


    1、所谓虚化,就是根据引用或者指针的真实类型,决定调用哪个方法。

    2、构造方法虚化,就是根据引用(或者指针)的真实类型,构造出一个对象,如果指针的真实类型是Base,返回Base*;如果指针的真实类型是Derived,返回Derived*。解决办法是:Base定义一个virtual方法Clone,调用new Base(*this),返回Base*;Derived重写Clone方法,调用new Derived(*this),返回Derived*。注意:一般情况下,子类重写父类方法,要求返回类型必须一致。目前,父类返回Base*,子类重写可以返回Derived*,也就是说C++支持协变。(口诀:进去叛逆,出来和谐)

    3、将非成员方法虚化,考虑output操作符<<的虚化。C++的多态是动态单分派,只会根据方法拥有者的真实类型决定调用哪个方法,因此要让<<虚化,需要在Base中定义方法virtual ostream& operator<<(ostream& str) ; 但是,这种情况下,要b<<cout这样写,这显然不符合常规。那该怎么办?

      使用非成员方法ostream& operator<< (ostream& s, const Base& b); 在该方法中调用虚方法b.print(s);

  • 相关阅读:
    poj2886 Who Gets the Most Candies?
    poj1201 Intervals
    poj3109 Inner Vertices
    poj1990 MooFest
    poj3368 Frequent values
    NOIP练习赛题目6
    NOIP练习赛题目5
    NOIP练习赛题目4
    NOIP练习赛题目3
    NOIP练习赛题目2
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3624003.html
Copyright © 2020-2023  润新知