学习笔记(18):c++入门到精通教程 c++11/14/17-基类指针、虚纯虚函数、多态性、虚析构...

立即学习:https://edu.csdn.net/course/play/9186/191702?utm_source=blogtoedu

//
#include <iostream>
#include "Human.h"
#include "men.h"
#include "Women.h"
//
//
int main()
{
//    std::cout << "Hello World!\n";
//
//    二:  派生类对象定义时调用构造函数的顺序
//      当定义子类对象时  是要调用父类和子类的构造函数的 而且 父类的构造函数的函数体先执行
//
//
//    三 public 、protected ,private
//    总结 : 三种访问权限
//    men.m_Age = 12;
//    men.m_prol = 14;
//   
//
//    四:函数 遮蔽
//    Men men;
//    men.funcpub();
//    men.funcpub;
//    也就是子类中 如果有了一个同名函数 那么父类中  不管有几个同名函数 子类中都无法访问。
//    如果我们确实是想调用父类中的同名函数  怎么办?
//    (1)  在子类的成员函数中调用 父类名::函数名
//    men.samenamefunc(12);
//
//    (2) using :
//
//    c++11: 让父类同名函数在子类中可见。
//    通过using这个关键字 让父类的同名函数 在子类可见
//
//    men.samenamefunc();
//    men.samenamefunc(12);
//
//    说明这种using 、、、 只能指定函数名  则凡是基类中的public 在子类中都可见
//    引入的主要目的 是用来实现在子类对象中调用父类的重载版本.  该函数在父类的参数和子类中不一样
//
//

        //一:基类指针  派生类
   /* Human* phuman = new Human();
    Men* pmen = new Men;*/

    //新玩法; 父类指针可以new'一个子类对象;  父类指针很强大
    //Human* phuman = new Men;  //这个是可以的;
    //Men* pmen = new Human;
     //phuman->funcHumen();


     //二 :虚函数

    //phuman->eat();  //调用的父类的eat函数 。 因为phuman是父类指针

     // 那如何调用Men和Women中的eat函数。
    //Men* pmen = new Men;
    //pmen->eat();

    //Women* pwomen = new Women;
    //pwomen->eat();

    //Human* phuman2 = new Human;
    //phuman2->eat();
    //一旦某个函数(在基类)
  //  Human* phuman = new Men;
    phuman->eat();  //调用的是父类的
  //  phuman->eat();
  //  phuman->Human::eat();
  //  delete phuman;


  //  phuman = new Women;
  //  phuman->eat();
  //  delete phuman;

  //  phuman = new Human;
  //  phuman->eat();
  //  delete phuman;

    //为了避免你在子类中写错虚函数 ,在C++11里  你可以在函数声明中加上 override关键字
            // 这个关键字用在 “子类”中 而且是虚函数专用
    //override就是用来说明派生类的虚函数  你用这个关键字之后  编译器就会默认你覆盖了 父类的参数


    //final final 也是虚函数专用  用在“父类中” 如果我们在父类的函数声明中 家里final的话  那么任何尝试 覆盖该函数的操作的话 都会出错

    //动态绑定: 运行的时候才决定你的phuman 对象绑定到哪个eat()函数上运行;
            
    //三:多态性


    //四:纯虚函数

    //一旦类里 有纯虚函数了 那么你就不能生成类的对象了
   // Human human;
    //Human *phuman = new Human ; 不合法
    //抽象类的主要目的 是用来统一调用子类对象
    //所以大家记住两点
    //函数纯虚函数的类 叫抽象类 不能用来生成;类对象  主要用于当成基类来生成子类用的
    //
    //Human* phuman = new Men;
    //phuman->eat2();
    
    // Human* phuman = new Women;


//五: 基类的析构函数 一般写成虚函数
//Men men;
//Men* pmen = new Men;
//delete pmen;

Human* phuman = new Men;
delete phuman;//没有执行子类的析构函数 坏事

    

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值