zoukankan      html  css  js  c++  java
  • 关于多态性和虚函数的理解

    对于多态性的理解加深,编译器的类型转换,以及
    我们在讲fish类的对象fh的地址赋给pAN之时,c++编译器进行了类型转换,此时pAn保存的是animal对象的地址。当fn函数执行pAn->breath()时,调用的就是animal的对象的breath函数。
    <-this指针
    anima对象内存
    fish新增加的部分
    当构造fish类的对象时,先从animal 的构造函数去构造animal对象,然后调用fish类的构造函数完成自身部分的构造,从而拼接出一个完整的fish对象,当讲fish类的对象转换成animal 的类型时,该对象被认为是源对象整个内存模型的上半部分,即为animal的对象所占的内存。
    virtual关键字可以改变此种情况;
    当c++编译器在编译的时候,发现animal的类的breath()函数是虚函数,这个时候c++采用迟邦定技术,编译时并不确定其具体的调用函数,而在运行时,依据对象的类型(比如是传递的类对象的地址)来确认调用的是哪一个函数。这种能力就是c++的多态性。,如果没有在breath()函数前加virtual关键字时,c++编译器在编译时就确定了哪个函数被调用,这叫做早期绑定。
    c++的多态性用一句话概括:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象的类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。
    凡是含有纯虚函数的类叫做抽象类,这种类只是作为基类的派生类服务,在派生类中必须完全实现基类的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。
  • 相关阅读:
    grep命令详解;单引号和双引号区别(转载)
    Linux下的系统性能调优工具--Perf (转载)
    Shiro
    WebLogic和Tomcat
    MD5加密(java和c#)
    深入理解java泛型
    VS2015常用快捷键总结(转)
    Java 反射 使用总结
    @RequestParam与@PathVariable的区别
    SVN被锁定的几种解决方法
  • 原文地址:https://www.cnblogs.com/HuaiNianCiSheng/p/5303273.html
Copyright © 2011-2022 走看看