笔记-2017.10.21

来源:互联网 发布:美亚保险 淘宝 编辑:程序博客网 时间:2024/06/06 10:56

1. 继承方式可见性:(可见性也称为可访问性)
所谓继承方式可见性,就是指“基类成员对派生类的可见性”,也称为“派生类成员函数能否访问基类成员”“基类成员对派生类对象的可见性”,也称为“派生类能否通过.运算符访问基类成员

两者是完全不同的概念,以下列出公有(基类的数据成员可见性在派生类中保持不变)、私有(基类的公有和保护全部成为派生类的私有成员)、保护(基类的公有和保护全部成为派生类的保护成员)三种继承方式的可见性:

公有继承:
a.基类成员对基类对象的可见性:

公有可见,其余不可见

b.基类成员对派生类的可见性:

公有和保护可见,私有不可见(访问私有成员需使用基类的公有方法)

c.基类成员对派生类对象的可见性:

公有可见,其余不可见

私有继承:

a.基类成员对基类对象的可见性:

公有可见,其余不可见

b.基类成员对派生类的可见性:
公有和保护可见,私有不可见

c.基类成员对派生类对象的可见性:

全部不可见

保护继承:

a.基类成员对基类对象的可见性:

公有可见,其余不可见

b.基类成员对派生类的可见性:

公有和保护可见,其余不可见

c.基类成员对派生类对象的可见性:
全部不可见

注:在私有继承中,基类成员只能通过派生类成员进行访问,而无法向下继承。

2.指向基类的指针与引用无法指向由私有或保护方法派生而来的派生类,因为这样的派生类里,虽存在基类成员,但基类成员为私有或保护的,其对对象来说是不可见的

3.以下贴上代码,帮助理解

#include "stdafx.h"#include <iostream>using namespace std;class foo{private:int test1;public:foo(int _test1 = 0):test1(_test1) {};~foo() {};void show1() { cout << test1 << endl; };};class foo1 :private foo{private:int test2;public:foo1(int _test1=0, int _test2 = 0) :foo(_test1),test2(_test2) {};~foo1() {};void show2() { show1(); cout << test2 << endl; }; //这里应该会出错,更新:现在应该不会了....吧,更新:现在真的不会出错了};class foo2 :public foo1{private:int test3;public:foo2(int _test1=0, int _test2=0, int _test3 = 0) :foo1(_test1, _test2), test3(_test3) {};~foo2() {};void show3() { show2(); cout << test3 << endl; }};int main(){foo fool(1);foo1 fooll(2,3);foo2 foolll(4, 5, 6);fool.show1();fooll.show2();//fooll.show1();错误//fool私有继承于foo,show1()是foo的公有方法,但show1()对派生类对象不可见,因其在派生类中为私有方法foolll.show3();//foo*ptr = new foo1;错误//指向基类的指针无法指向由私有和保护继承而来的派生类,因为在派生类中基类数据无法直接访问,仅公有继承可以/*对于继承方式为protected和private的派生类对象,基类的公有成员、私有成员和保护成员都是不可见的,所以你把基类指针指向protected和private继承的派生类对象时,对于基类的公有成员,这个对象到底能不能访问到呢?他是基类指针,若是基类对象就该能访问,但指向的是这两种方式继承的对象,按理又不能访问,矛盾了,所以不允许他指向这样的对象*/foo1*ptr = new foo2;//这就可以了,因为foo2是通过公有继承foo1得来的return 0;}

代码里,foo为基类,foo1由foo私有继承而来,foo2由foo1公有继承而来。

现在分析foo的私有成员为test1,公有成员为show1(),foo1的私有成员为test1test2show1(),公有成员为show2(),foo2的私有成员为test1test2test3show1(),公有成员为show3()和show2()。



原创粉丝点击