《C++ Primer Plus(第六版)》(28)(第十四章 C++中的代码重用 笔记)
1.初始化顺序是按照类定义中的顺序的。
2.私有继承,基类的公有成员和保护成员都变成派生类的私有成员。
在不进行显式类型转换的情况下,不能将派生类的引用或指针赋给基类引用或指针。
3.保护继承,公有成员变保护成员。
4.使用using可以改变基类私有变量的访问权限
class son: private Father { public: using Father::menber; }不管menber是函数还是数据成员,都是写个名字就行了。不需要带其它东西。
如果有重载函数,则重载函数都可用了。
一些非常旧的版本,可能是不需要写using关键字的。
5.虚基类(Virtual base class)
跟抽象基类不是一个概念的,使用了虚函数的那个叫做抽象基类。。。
虚基类用来解决多重继承的问题。
在继承的时候跟public写在一起。
6.在多重继承中,调用构造函数的时候,子类只能够调用父类的构造函数,更上一层的祖辈类是不能显示调用的。
但是对于虚基类,是可以的,而且,在父类的构造函数中,将不再调用父类的父类的构造函数,如果不显式写明,将使用默认构造函数。
说的有点抽象。
class A { public: A(int a) { _a = a; } int _a; }; class B :virtual public A//这里要声明虚基类,下面才能使用A的构造函数 { public: B(int a, int b) :A(a) { _b = b; } int _b; }; class C :public B { public: C(int a, int b, int c) :B(a, b), A(a)//这里的A(a),如果上面不声明了虚基类,是不能通过编译的。现在这样,B里面讲不再调用A(a)了。 { _c = c; } int _c; };
7.对于多重继承,其他方法的重复调用问题。好像没有新的语法来解决,只能通过改写代码,分拆函数功能来实现。
8.类模板的类型参数,可以提供默认值的。
template<typename T = int> class A { public: T get(){ return _a; } private: T _a; };不过<>还是要保留的。
可以这样声明变量
A<> a
隐式实例化,就是平时使用的那些,在声明对象的时候才生成实例。
显式实例化,是声明了显式的模板实例,但是没有对象生成的。
具体化,主要是修改具体的实现方式。
模板类还允许部分具体化。
//普通模板 template<typename T1, typename T2> class Pair{}; //部分具体化 template<typename T1> class Par<T1, int>{};如果全部都具体化,就变成显式具体化了。
template<> class Par<int, int>{};
10.模板类的友元分为三类:
非模板友元
约束模板友元,友元的类型取决于类被实例化时的类型;
非约束模板友元,友元的所有具体化都是类的每个具体化的友元。
11.别名,C++11的东西
typedef const char* pc1;
using pc2 = const char*;
这两个语句是等价的。
12.到现在的内容,具体的说明开始越来越不重要了,关键还是多练,否则看的再多也不知道说啥。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2