找回密码
 立即注册
收起左侧

C++老鸟日记001 继承

3
回复
7134
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-3 09:00:33 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2018-10-1 20:41 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org),作者: 女儿叫老白 (白振勇),转载请注明出处!

---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。


引言
----------------------------------------------------------------------------------------------------
      大家好,从今天开始,我们跟大家一起学习、讨论一些C++的知识,这些知识是小编18年C++跨平台软件研发工作中的积累和总结,希望能帮到大家。

正文
----------------------------------------------------------------------------------------------------
    面向对象有三大特征:封装、继承、多态。我们今天来讨论一下继承。
    继承是什么意思呢?在自然界中,我们会把哈士奇、吉娃娃、德国牧羊犬等狗狗都叫做犬类,而把鹦鹉、大雁、天鹅等称作鸟类,进行如此的归类是因为他们有一些相同点,当然他们也有不同点。具有相同点的这种特性,我们就可以称之为从某个基类继承得到的特性,也就是基类具备某种特性后,子类可以通过继承也得到这种特性。比如所有犬类都会“汪汪”叫,哈士奇、吉娃娃、德国牧羊犬就都具有这种特性。
定义类CAnimal(野兽),它提供接口run(跑)、接口roar(吼叫)和接口eatSomething(吃东西)。
//:animal.h
lass CAnimal
{
public:
    CAnimal(){}
    virtual ~CAnimal(){}
    virtual void run()=0;
    virtual void roar()=0;
    void eatSomething(){}
};
·         务必注意,类定义处以";"(分号)结束。否则导致的编译错误,可能很难查找到原因。
·        接口前面的virtual表示该接口是虚接口,可以被派生类覆盖。     
·        接口后的=0,表示该接口是纯虚接口,派生类必须提供具体实现,否则派生类将无法实例化(无法用来声明对象)
·        CAnimal(){}
这种语法,表示直接将接口的实现编写在头文件中,
当然也可以写成CAniaml();然后在派生类中编写接口的实现。
请注意,如果在头文件中只写接口声明,那在接口声明后一定用";"​(分号)结束,如果在头文件中直接写定义(就是写上花括号),那么就如上述代码即可,无需以分号结束。
·        ~CAnimal() 析构函数的前面用virtual表示该类的派生类析构时,其派生类的析构函数一定会被调用,这种语法可以保证编译器做到。否则,有可能在对象析构时只调用了父类的析构函数,却忘记调用派生类的析构函数,就可能导致内存泄漏。

定义类CDog(狗狗), 从CAniaml派生
//: dog.h
class CDog : public CAniaml
{
public:
CDog(){}
~CDog(){}
virtual void run(){ std::cout << "我在奔跑."<< std::endl;}
virtual void roar() { std::cout << "汪汪"<< std::endl};
}
l  CDog类从CAnimal派生,因为CAnimal已经提供了eatSomething()接口,因此CDog无需再提供实现,它即可从父类自动派生该接口,除非它的行为与父类不同。
l  CDlog的run()和roar()接口前仍旧写了virtual限定符,表示从父类继承而来的接口,当然CDog的virtual限定符也可以省略。我个人的建议是保留。
我们可以把类的体系设计成很多层,然后每一层都可以提供一些不同的特性,以供派生类继承。我们也可以把其中某一层设计成纯虚类,这相当于设计一个纯虚接口类,这样使用者就可以用这个纯虚类定义一个指针指向派生类对象并调用接口,而无需关注这个对象到底是哪个子类。
回复

使用道具 举报

累计签到:1568 天
连续签到:1 天
2018-9-5 21:42:26 显示全部楼层
建议将教程优化一下,加上开头和结尾,不要上来就讲知识点,这样对初学者不是很友好。
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-6 08:44:43 显示全部楼层
本帖最后由 baizy77 于 2018-9-6 11:05 编辑
yafeilinux 发表于 2018-9-5 21:42
建议将教程优化一下,加上开头和结尾,不要上来就讲知识点,这样对初学者不是很友好。 ...

好的,谢谢,我会重新编辑一下,继续更新。欢迎大家提出宝贵的意见、建议,我会持续改进。
回复 支持 反对

使用道具 举报

尚未签到

2020-4-21 07:30:33 显示全部楼层
我觉得挺好的,很赞,很适合我学了一半,想巩固基础的。直接了当。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了