在《基类和派生类》中讲述了单继承的基本概念,这节着重讲述继承的具体应用......
在《基类和派生类》中讲述了单继承的基本概念,这节着重讲述继承的具体应用。
在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。
成员访问权限的控制 在《基类和派生类》一讲中,我们讲述了派生类和派生类的对象对基类成员的访问权限的若干规定,这里通过一个实例进一步讨论访问权限的具体控制,然后得出在使用三种继承方式时的调用方法。
//继承性的public继承方式的访问权限的例子 #include
file://定义基类A class A { public: A() { cout<<"类A的构造函数!"< A(int a) { Aa = a, aa = a, aaa = a; } void Aprint() { cout<<"类A打印自己的private成员aa:"< int Aa; private: int aa; protected: int aaa; };
file://定义由基类A派生的类B class B : public A { public: B() { cout<<"类B的构造函数!"< B(int i, int j, int k); void Bprint() { cout<<"类B打印自己的private成员bb和protected成员bbb:"< void B_Aprint() { cout<<"类B的public函数访问类A的public数据成员Aa:"< cout<<"类B的public函数访问类A的protected数据成员aaa:"< GetAaaa(); GetAaaa1();} private: int bb; void GetAaaa() { cout<<"类B的private函数访问类A的public数据成员Aa:"< cout<<"类B的private函数访问类A的protected数据成员aaa:"< protected: int bbb; void GetAaaa1() { cout<<"类B的protected函数访问类A的public数据成员Aa:"< cout<<"类B的protected函数访问类A的protected数据成员aaa:"< };
file://基类B的构造函数,需负责对基类A的构造函数的初始化 B::B(int i, int j, int k):A(i), bb(j), bbb(k) {}
file://程序主函数 void main() { B b1(100, 200, 300); file://定义类B的一个对象b1,并初始化构造函数和基类构造函数 b1.B_Aprint(); file://类B调用自己的成员函数B_Aprint函数 b1.Bprint(); file://类B对象b1访问自己的private和protected成员 b1.Aprint(); file://通过类B的对象b1调用类A的public成员函数 }
|
该程序的输出结果为:
类B的public函数访问类A的public数据成员Aa:100
类B的public函数访问类A的protected数据成员aaa:100
类B的private函数访问类A的public数据成员Aa:100
类B的private函数访问类A的protected数据成员aaa:100
类B的protected函数访问类A的public数据成员Aa:100
类B的protected函数访问类A的protected数据成员aaa:100
类B打印自己的private成员bb和protected成员bbb:200,300
类A打印自己的private成员aa:100
上述是属public继承方式,我们可以得出以下结论:
在公有继承(public)时,派生类的public、private、protected型的成员函数可以访问基类中的公有成员和保护成员;派生类的对象仅可访问基类中的公有成员。
让我们把继承方式public改为private,编译结果出现1处如下错误:
'Aprint' : cannot access public member declared in class 'A'
出错语句在于:b1.Aprint();,因此,我们可以得出以下结论:
在公有继承(private)时,派生类的public、private、protected型的成员函数可以访问基类中的公有成员和保护成员;但派生类的对象不可访问基类中的任何成员。另,使用class关键字定义类时,缺省的继承方式是private,也就是说,当继承方式为私有继承时,可以省略private。
让我们把继承方式public改为protected,可以看出,结果和private继承方式一样。