友元关系可以继承_C++快速入门学习笔记3|覆盖/重载/友元/虚函数

《C++快速入门》学习笔记

进度:P24

【覆盖overriding】

1、 在子类当中再次声明,再次实现即完成覆盖

2、 可以在子类函数当中调用父类的函数,例如在cocos2dx当中,我们要对onEnter()进行覆盖,那么我们可以在函数体当中写Layer::onEnter();然后再在后面追加我们希望添加的内容

3、 注意声明的输入参数和返回值要与原来保持一致

是在继承的过程中出现(是父类和子类之间的关系)

【重载】

1、 是针对同名函数不同参数的情况,但如果仅是返回值不同则不构成重载

2、 对从基类继承来的方法进行重载,程序永远不会像你预期的那样工作

例:可以看到在下面的程序当中,Fish类当中的void eat(int eatNum)这个函数将Animal当中的void eat()覆盖掉了,所以无法调用sf.eat()这个函数

bb8cf278d5fc472f28f9f477292128cf.png

【友元函数】

只要在某个类当中声明即可(最开头加上friend)

【虚方法】

引入问题:使用指向对象的指针

在没有创建变量的情况下为数据分配内存,即直接创建一个指针并让它指向新分配的内存块(注意每一个new要对应一个delete)

例:

Int *pointer = new int;

*pointer = 10;

Std::cout<

Delete pointer;

1cf0a36fa102ab270fc87aa5f904a31b.png

注意:

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、 析构器都是虚方法,否则编译器会根据它们在编译时的类型调用基类里定义的版本(构造器),这样容易造成内存泄漏

8ceabc206fd18a60e845ac9de3ec8bd0.png

写在后面:

问就是虚方法!算是简单总结整理了一下语法和用法方面的基础知识orz 有一点点理清楚指针到底是个什么东西了!咕咕咕明天也会继续努力的!

f2875768a0ee0d1ae54815e8ea0c7a67.png

IT双侠的咕咕咕日常

内容:咸哥

排版:咸哥

特别鸣谢:小甲鱼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值