随笔 - 56, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

类的单一继承、公有继承和赋值兼容

◆公有继承:
1、派生类的成员函数可以访问直接基类中的公有成员和保护成员,也可访问间接基类中的公有成员和保护成员。
2、派生类的对象只能访问直接基类中的公有成员和间接基类的公有成员。

私有继承方式:
在私有继承时,派生类的成员函数可访问直接基类中的公有成员和保护成员,而不可访问间接基类中的任何成员;派生类的对象不可访问基类中的任何成员。

保护继承方式:
保护继承方式将使得基类中的公有成员和保护成员都成为派生类中的保护成员,这样是派生类的对象不可访问基类中的所有成员。同时使得派生类的成员函数可访问直接基类和间接基类中的公有成员和保护成员。
对单个类来讲,保护成员和私有成员没有什么区别,该类的对象都不能访问。但对继承来讲,保护成员不同于私有成员,保护成员可被派生类中成员函数访问,而私有成员不可被派生类访问。保护成员又与公有成员不同,保护成员在任何继承方式下也不能被派生类的对象访问,而公有成员在公有继承下可被派生类的对象访问。


◆公有继承和赋值兼容

基类中的私有成员和不可访问成员在派生类中是不可访问的。
所谓不可访问即是不可见,不能够进行操作。
赋值兼容规则是指在公有继承情况下,派生类的对象可作为基类的对象来使用,即派生类对象就是基类对象,正如前面讲过的派生类是基类的子类型。
假如D类公有继承B类,D类是B类的子类型。赋值兼容规则指出:

1、派生类的对象可以赋值给基类的对象。例如:
   D  d;
   B  b;
   b=d;
这是允许的。如果d=b;则是非法的。

2、派生类的对象的地址值可用来给指向基类对象的指针赋值。例如:
   D  d;
   B  *pd=&d;
这是允许的。如果反过来,则是非法的。

3、派生类的对象可以用来初始化基类对象的引用。例如:
   D  d;
   B  &rd=d;
这是允许的。如果反过来就是非法的。

例如,分析下列程序:

 1#include<iostream>
 2using namespace std;
 3class M
 4{
 5    public:
 6       M()
 7       {
 8           m=0;
 9       }

10       M(int i)
11       {
12           m=i;
13       }

14       void Print()
15       {
16           cout<<m<<endl;
17       }

18       int Getm()
19       {
20           return m;
21       }

22    private:
23       int m;
24}
;
25class N:public M
26{
27    public:
28       N()
29       {
30           n=0;
31       }

32       N(int i,int j):M(i),n(j)
33       {
34       }

35       void Print()
36       {
37           cout<<n<<",";
38           M::Print();
39       }

40    private:
41       int n;
42}
;
43
44void fun(M &p)
45{
46    cout<<p.Getm()-5<<",";
47    p.Print();
48}

49int main()
50{
51    M m(17),q;
52    N n(13,18);
53    n.Print();
54    q=n;
55    q.Print();
56    M *pm=new M(16);
57    N *pn=new N(15,19);
58    pm=pn;
59    pm->Print();
60    fun(*pn);
61    N n1(21,34);
62    M &rm=n1;
63    rm.Print();
64    n1.Print();
65    return 0;
66}

67
运行结果为:
18 13
13
15
10 15
21
34 21

posted on 2009-08-21 11:01 八路 阅读(478) 评论(0)  编辑 收藏 引用 所属分类: C++ 类


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理