C++总结之二(类的继承)
顾名思义,private/public/protected 分别表示 私有/公开/保护,它们是一组用于访问权限控制的关键字。那么首先,需要澄清的一个关键点是,是要控制谁访问谁的权限?这个访问的主语(施事)是谁?宾语(受事)是谁?
我们经常听到这样的说法:
1)一个类友元可以访问该类的任何成员(包括成员变量及成员方法,下同)。
2)private成员只有该类自身可以访问,protected成员只有该类及其派生类可以访问,public成员所有的人都可以访问。
宾语(受事)是谁这一点很明确,是类的成员(包括成员变量及成员方法)。主语(施事)是谁?这是让大家发生混淆的关键点。也是这个说法中含糊不清的地方。
想清楚一点,其实主语(施事)指的是一个函数,而不是类(当然更不是变量)。private/public/protected要控制的是一个函数(施事)对一个类的成员(包括成员变量及成员方法)的访问权限。因此比较完整的说法是:
1)一个类友元(包含友元函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。
2)除去友元外,private成员只有该类自身的成员函数可以访问,protected成员只有该类的成员函数及其派生类的成员函数可以访问,public成员则所有的函数都可以访问。
也就是说,当我们说一个类可以访问XXX,其实暗指这个类的成员函数可以访问XXX。了解了这一点,外加一条显而易见的规则,上面的问题就不难回答了。这条规则是:
3)派生类在继承时可削弱成员的访问权限(通过protected/private修饰)。例如上面的例子class P : protected O {…}; 那么某个函数通过类P访问O中成员时,该函数对类O中的public成员只有protected权限。
VC++的继承使可以多向继承的(也就是它可以同时认几个父亲),基类和派生类之间的关系:
1。Class SunClass : BaseClass
2. Class SunClass : protect BaseClass
3. Class SunClass : private BaseClass
4. Class SunClass : Public BaseClass
首先要说的是派生类可以继承基类的公共成员和保护成员,私有成员、构造函数、析构函数不继承。
第一种继承: 缺省 ,为private继承
第二种保护继承:保护成员和公有成员全部变成保护成员
第三种私有继承:保护成员和公有成员全部变成私有成员 (儿子比老子小气,统统不让别人访问)
第四种公开继承:嘿嘿!这下可不是保护和公有统统变成公共成员,这里是原封不动,保护依旧是保护,公开依旧是公开。 (公开继承,就是拷贝不走样)
好了,继承完了,接下来可以做自己的东西了,可以做什么呢?可以添加自己的变量和函数。站在巨人的肩膀上完成自己更高一级的功能了!
- 构造函数和析构函数,这叫专项函数,规定没有返回值,连void都没有,给编译器调用的,编译器才不需要返回值呢。
构造函数就是和类同名的函数,作用就是在调用类时自动的初始化,只要该类的变量被创建,首先就是调用构造函数,通常我很少写具体的代码在里面,偶尔根据需要些写变量的赋值。
但是构造函数也可以overload,也可以带参数,一旦有了超过一个以上的构造函数,则必须在调用的时候指名参数。
析购则是反过来,销毁对象的时候被调用,你不希望外泄的数据都可以写在这里。析购是不可以overload的,也没有参数和返回值。构造函数分配的堆的内存空间,都要在析购函数里用delete释放掉,不然你的程序会很占资源。
构造函数的初始化表达式表:
构造函数(参数) 初始化表 {函数体}
1。如果是派生类:在初始化表里掉用基类的构造函数。
CSonClass:: CSonClass (参数) : CBaseClass(参数)
{
派生类的构造函数体
}
- 如何在一个类里定义另一个带参数的类?
由于类是一个抽象的东西,它不能分配空间,所以当有另外一个带参数的类做它的子成员时,
无法把具体的参数给它,那么怎么办?
嘿嘿!在构造函数里面打主意! 构造函数名后打冒号,再把调用的类和它的参数写上,瞧,
就像下面这样做:
Class AAA{
AAA (char * 参数): BBB(参数)
{...}
}
看见没有,就是这样,在AAA这个构造函数后加冒号,再把BBB类和它的参数写上,哈哈,大功告成!
成功编译。