C++第五讲.pptVIP

  • 3
  • 0
  • 约1.9千字
  • 约 22页
  • 2016-08-15 发布于重庆
  • 举报
C第五讲

面向对象程序设计与c++ 第五讲 内容 多重继承与访问控制 指向成员的指针 多重继承 当继承基类时,在派生类中就获得了基类所有数据成员的副本,该副本成为子对象。假设对类d1和类d2进行多重继承而形成m1,类m1会包含d1的子对象和d2的子对象,所以m1对象看上去如下图: 子对象重叠 现在考虑如果d1和d2都从相同基类 派生的,该基类成为base,那会发生 什么呢? m1包含基类base的两个子对象。 该继承层次结构成为“菱形”。 问题1:增加了存储空间 问题2:引入了二义性 虚基类 对Q1,对类Mi中的函数vf()进行重新定义以消除二义性。 “最晚辈派生”和虚基类 最晚辈派生类:是指当前所在的类,当考虑构造函数时它尤为重要。 例:在MBase的构造函数中,最晚辈派生类是Mbase;在D1构造函数中,D1是最晚辈派生类; 在Mi构造函数中,Mi是最晚辈派生类. 打算使用虚基类时,最晚辈派生类的构造函数,不管离虚基类多远,都有责任对虚基类进行初始化。 访问控制 类中一个成员可以是private、protected或public。 在class里,成员默认为private,而struct里的成员默认为public。 保护成员 对基类的访问 向成员一样,基类也可以是private、protected或public class X : public B { /*…*/}; class Y : protected B { /*…*/}; class Z : private B { /*…*/}; class XX : B {/*…*/}; //B是私用基类 struct YY : B {/*…*/}; //B是公用基类 对基类的访问 考虑从基类B派生出的类D: 如果B是private基类,那么B的public和protected成员在D中都该成了private成员,只能由D的成员函数和友元访问。只有D的成员和友元能将D*转换成B*。 如果B是protected基类,那么B的public成员在D中变成为protected成员,B的protected成员在D中仍然是protected成员,只能由D的成员函数和友元,以及由D派生出来的类的成员函数和友元访问。只有D的成员和友元,以及由D派生出来的类的成员函数和友元能将D*转换成B*。 如果B是public基类,那么B的public和protected成员在D中仍是public和protected。B的public成员可由任何函数使用。除此之外,它的protected成员能由D的成员函数和友元,以及由D派生出来的类的成员函数和友元访问。任何函数都能将D*转换到B*。 对于B中的所有private成员在D中是隐藏的,不能被访问。 多重继承和访问控制 在一个派生类里,如果一个名字或者基类可以从多条路径到达,那么若有一条路径使它能够访问,它就是可访问的。 如果一个实体可以通过多条路径,我们还是可能无歧义地引用它。 使用声明和访问控制 不能通过“使用声明”取得对更多信息的访问权。 “使用声明”只是一种能使信息的使用更方便的机制。 指向成员的指针 指向函数的指针 指向成员的指针 指向函数的指针 指向函数的指针 一个函数只能做两个事情:调用它;或者取得它的地址(指针),可以通过指针调用它。 void error(string s) { coutsendl; } void (*efct)(string); //指向函数的指针 void f() { efct = error; //efct指向error efct(“error”); //通过efct调用error } 指向函数的指针 void (*f1)(string) = error; void g() { f1(“error”); //ok (*f1)(“error”); //ok too } 指向函数的指针的数组 typedef void (*PF)(); PF edit_ops[] = { cut,paste,copy,search }; PF *button2 = eidt_ops; 调用第三个函数 button2[2](); 指向成员的指针 * * Q1.D1和D2分别对vf()定义 会导致冲突。 Q2.创建一个new pmi并将 类型转化为Mbase*, 由于没有办法知道使用 D1的MBase还是使用 D2的MBase作为结果地址, 编译器将不会受理。

文档评论(0)

1亿VIP精品文档

相关文档