《C++快速入门》学习笔记
进度:P24
【覆盖overriding】
1、 在子类当中再次声明,再次实现即完成覆盖
2、 可以在子类函数当中调用父类的函数,例如在cocos2dx当中,我们要对onEnter()进行覆盖,那么我们可以在函数体当中写Layer::onEnter();然后再在后面追加我们希望添加的内容
3、 注意声明的输入参数和返回值要与原来保持一致
是在继承的过程中出现(是父类和子类之间的关系)
【重载】
1、 是针对同名函数不同参数的情况,但如果仅是返回值不同则不构成重载
2、 对从基类继承来的方法进行重载,程序永远不会像你预期的那样工作
例:可以看到在下面的程序当中,Fish类当中的void eat(int eatNum)这个函数将Animal当中的void eat()覆盖掉了,所以无法调用sf.eat()这个函数
【友元函数】
只要在某个类当中声明即可(最开头加上friend)
【虚方法】
引入问题:使用指向对象的指针
在没有创建变量的情况下为数据分配内存,即直接创建一个指针并让它指向新分配的内存块(注意每一个new要对应一个delete)
例:
Int *pointer = new int;
*pointer = 10;
Std::cout<
Delete pointer;
注意:
1、 由于Animal当中的name是可以由Fish访问的,所以要设置为protected
2、 在书写子类Fish的构造函数的时候,使用特定的语法
Fish(std::string name) :Animal(name)
会先调用Animal的构造函数
Main函数当中,是先为Fish的实例分配了内存,通过新建Animal*的指针,那么下面saltyFish调用函数eat()的时候就要使用“->”符号,而不是“.”符号
我们在Fish类里对eat()进行了覆盖,但实际上调用的是Animal::eat(),因为程序在编译的时候,编译器会检查所有代码取一种最优处理,saltyFish在编译的时候是Animal类型的指针,编译器就认为这个指针调用的eat()是Animal::eat()方法,因为这是执行起来最快的解决方案
虽然new的时候是分配的Fish类型的指针内存,但是因为Fish是继承自Animal的,所以可以用Animal来接收。此时它运行时才分配的内存和编译时的类型是不一样的。
修改方法:
1、 将saltyFish这个指针声明为Fish类型而不是Animal
2、 将Animal当中的eat()方法声明为虚方法
注意:
1、 声明虚方法只要在前面加上保留字virtual即可
2、 虚方法是继承的,一旦基类里把某个方法声明为虚方法,在子类里就不可能把它再声明为一个非虚方法了
1、 声明虚方法除了会使程序慢一点点之外没有任何坏处,如果拿不准要不要声明为虚方法,那就声明成虚方法就好了
2、 在实现一个多层次的类继承关系的时候,最顶级的基类应该只有虚方法
3、 析构器都是虚方法,否则编译器会根据它们在编译时的类型调用基类里定义的版本(构造器),这样容易造成内存泄漏
写在后面:
问就是虚方法!算是简单总结整理了一下语法和用法方面的基础知识orz 有一点点理清楚指针到底是个什么东西了!咕咕咕明天也会继续努力的!
IT双侠的咕咕咕日常
内容:咸哥
排版:咸哥
特别鸣谢:小甲鱼