1、继承与派生二/类型兼容规则举例。本例演示子类对象(指针)可赋给父类对象(指针),/但:通过基类的对象名、指针只能使用从基类继承的成员#include using namespace std;class B0 /基类B0声明 public: void display()cout这是基类 B0 的display()endl;/公有成员函数;class B1: public B0 public: void display()cout这是一级子类 B1 的display()endl; ;class D1: public B1 public: void display()cout这是二级子类 D1 的d
2、isplay()display(); /对象指针-成员名 void main(void) B0 b0; /声明B0类对象 B1 b1; /声明B1类对象 D1 d1; /声明D1类对象 B0 *p; /声明B0类指针 p=&b0; /B0类指针指向B0类对象 fun(p); p=&b1; /B0类指针指向B1类对象 fun(p); p=&d1; /B0类指针指向D1类对象 fun(p);/多继承示例,本例中 类C 从 类A和类B继承#include using namespace std;class Apublic: void setA(int); void showA();private:
3、int a;class Bpublic: void setB(int); void showB();private: int b;class C : public A, private Bpublic: void setC(int, int, int); void showC();private: int c;void A:setA(int x) a=x; void B:setB(int x) b=x; void C:setC(int x, int y, int z) /派生类成员直接访问基类的公有成员 setA(x); /基类 A 的 公有成员 setB(y); /基类 B 的 公有成员 c
4、=z;/其它函数实现略void main(void) C obj; obj.setA(5); obj.showA(); obj.setC(6,7,9); obj.showC();/ obj.setB(6); 错误,原因:C 是通过私有方式继承 B,B中的公有成员相当 /于C的私有成员,不能通过对象访问(对象指针也不可以)/ obj.showB(); 错误,原因同上/单一继承时的构造函数举例。本例演示了子类构造函数如何向基类构造函数传/递参数,同时需注意子类C中的Print函数式如何复用基类功能的#include using namespace std;/-/类B 的定义/-class B pu
5、blic: B(); B(int i); B(); void Print() const; private: int b;/-B:B() b=0; coutB的默认构造函数被调用.endl;/-B:B(int i) b=i; coutB的带参构造函数被调用. endl;/-B:B() coutB的析构函数被调用.endl; /-void B:Print() const coutB:Print()被调用 b=bendl; /-/类 C 的定义/-class C:public B public: C(); C(int i,int j); C(); void Print() const; priva
6、te: int c;/-C:C() c=0; coutC 的默认构造函数被调用.endl;/-C:C(int i,int j):B(i) /重点:子类C的构造函数给基类构造函数传递参数 i c=j; coutC 的带参构造函数被调用.endl;/-C:C() coutC 的析构函数被调用.endl; /-/注意:这是面向对象常用的招数:需要增加子类新的功能,但又需要用到基类的相关/功能,则覆盖基类函数,方法是:1、先完整的引用基类函数;2、添加新功能/这就实现了代码复用void C:Print() const B:Print(); coutcendl; /-void main() C objC
7、(5,6); /思考此处定义 C 的对象objC时,将发生什么? objC.Print();/多继承且有内嵌对象时的构造函数#include using namespace std;/-/类 B1 的定义/-class B1 /基类B1,构造函数有参数public: B1(int i) cout B1构造函数 iendl;/-/类 B2 的定义/-class B2 /基类B2,构造函数有参数public: B2(int j) cout B2 构造函数jendl;/-/类 B3 的定义/-class B3 /基类B3,构造函数无参数public: B3()coutB3 构造函数endl;/-/类
8、 C 的定义,注意其特殊性,一是从三个基类继承,二是有三个内嵌对象/定义C的构造函数时,必须对不存在无参构造函数的基类构造函数传递参数,/同时对不存在无参构造函数的对象成员传递参数/思考1、C的构造函数似乎没对memberB3初始化?/思考2、C的构造函数若定义成如下方式,有何问题?/ C(int a, int b, int c, int d):B1(a),memberB1(c),B2(b)/观察:程序运行后基类构造函数调用次序(包括成员对象初始化对构造函数的调用)/-class C: public B2, public B1, public B3 public: /派生类的公有成员 C(in
9、t a, int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b) private: /派生类的私有对象成员 B1 memberB1; B2 memberB2; B3 memberB3;void main() C obj(1,2,3,4); /派生类析构函数举例#include using namespace std;/-class B1 /基类B1声明 public: B1(int i) cout B1 构造 iendl; B1() cout B1 析构endl;/-class B2 /基类B2声明public: B2(int j) c
10、out B2 构造jendl; B2() cout B2 析构endl; ;/-class B3 /基类B3声明public: B3()cout B3 构造endl; B3() cout B3析构 endl; ;/-class C: public B2, public B1, public B3 public: C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b)private: B1 memberB1; B2 memberB2; B3 memberB3;/-void main() C obj(1,2,3,4);
11、/-/同名隐藏示例,注意子类D1在同名覆盖情况下是如何访问基类成员的#include using namespace std;/-class B1 /声明基类B1 public: /外部接口 int nV; void fun() coutB1 的成员函数 funendl;/-class B2 /声明基类B2 public: /外部接口 int nV; void fun()coutB2 的成员函数 funendl;/-class D1: public B1, public B2 public: int nV; /同名数据成员 void fun()coutD1 的成员函数 funendl; /同名函数成员;/-void main() D1 d1; d1.nV=1; /对象名.成员名标识, 访问D1类成员 d1.fun(); d1.B1:nV=2; /作用域分辨符标识, 访问基类B1成员 d1.B1:fun(); d1.B2:nV=3; /作用域分辨符标识, 访问基类B2成员 d1.B2:fun();
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2