当前位置: 首页 > C/C++, cpp > 正文

C++ 学习笔记 继承相关小结

OOP:

面向对象的核心思想: 封装,多态,继承。

基类:

基类和普通的类没有什么太大的区别,其它类可以通过继承它,合理获得它的接口,数据等东西。不过有以下需要注意的一些地方。

析构函数请一定设置成虚函数,这样后边它有派生类后,派生类就包含了一个虚的析构函数,我们就可以根据自己的需要覆盖(重写)这个方法。否则,不经意间内存就泄漏了。

动态绑定:在运行时确定函数的版本。

我们在重写这个函数的时候C++11规定可以在被重载的函数后边写一个override以做标识。

不存在从基类向派生类的隐式转换,原因其实很简单,派生类一般肯定有基类不具备的一些变量,函数之类的,如果允许转换,那么我们在不知情的情况下尝试访问基类中没有的东西一定会BOOM!!。

派生类却可以向基类转换,但是仅仅限制于指针和引用的转换,类对象之间是没有转换规则的。多余数据直接CUT掉。

至于protected 和 private 说明符之间的区别:

private:   自己,友元

protected: 自己,友元,派生类

虚函数的调用可能在运行时才被解析,派生类中的虚函数,一旦某个函数被声明成虚函数,则它的形参类型必须必定与被它覆盖的基类函数完全一致。

派生类如果定义了一个函数与基类中的虚函数的名字相同但是形参名字相同但是形参列表不同。

其实虚函数也是由自己的默认实参的,如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。

如果一个派生类虚函数需要调用它的基类版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生类版本自身的调用,从而导致无限循环。

抽象基类:

纯虚函数:

只声明了函数的参数与函数名,但是没有定义函数体,并且函数后边一般会写“= 0”来标识,告诉编译器这是一个纯虚函数。如果需要给这个函数一个函数体,则需要在类外定义这个函数体。

抽象基类:

含有纯虚函数的类是抽象基类,抽象基类负责定义接口,后序的其他类可以覆盖接口。

派生类构造函数只初始化它的直接基类。

继承中的类作用域

我们将其中的规则总结出来:

1.派生类的作用域包含在基类作用域之内,我们可以在派生类中调用基类中的方法就是因为如此

2.我们能使用那些成员仍然是在静态类型中决定的

3.当名字与继承中的名字冲突的时候,派生类中的函数都会被覆盖掉

4.使用作用域解析符一直是我们处理名字冲突的神器。当然,除了覆盖继承而来的虚函数,派生类最好不要重定义其它重名方法。

5.当一个基类和派生类中的虚函数必须有相同的形参列表才能重载不然就会被编译器理解为重写

7.如果派生类需要移动操作,拷贝操作,那么基类中必须定义这些操作,不然派生类就是未定义的。所以当我们的派生类需要使用移动,拷贝操作的时候其实还是调用基类的操作。

8.派生类析构函数只符在只负责销毁由派生类自己分配的资源。

在构造函数和析构函数中调用虚函数

如果构造函数或析构函数调用了某个虚函数,则我们应该执行与构造函数或析构函数所属类型相对应的虚函数版本。

 

 

 

本文固定链接: http://zmrlinux.com/2016/03/16/c-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0-%e7%bb%a7%e6%89%bf%e7%9b%b8%e5%85%b3%e5%b0%8f%e7%bb%93/ | Kernel & Me

该日志由 root 于2016年03月16日发表在 C/C++, cpp 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C++ 学习笔记 继承相关小结 | Kernel & Me