C++ 三种继承方式
300 Words|Read in about 2 Min|本文总阅读量次
Android源码中有一些经常会遇到的c++基础的内容,笔者对C++ 三种继承方式进行简单熟悉。
C++ 三种继承方式
继承方式 | public | protected | private |
---|---|---|---|
派生类实例化对象访问基类成员 | public成员 | 不能访问 | 不能访问 |
派生类的成员函数访问基类成员 | public和protected成员 | public和protected成员 | public和protected成员 |
子类的引用(或指针)直接转换为父类 | 可以 | 可以 | 不可以 |
1公有继承
公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象只能访问派生类的公有成员(包括继承的公有成员),访问不了保护成员和私有成员。
1#include <iostream>
2using namespace std;
3
4class Base
5{
6public:
7 Base(int nId) {mId = nId;}
8 int GetId() {mId++;cout<< mId<<endl;return mId;}
9protected:
10 int GetNum() {cout<< 0 <<endl;return 0;}
11private:
12 int mId;
13};
14
15class Child : public Base
16{
17public:
18 Child() : Base(7) {;}
19 int GetCId() {return GetId();} //新增成员可以访问公有成员
20 int GetCNum() {return GetNum();} //新增成员可以访问保护成员
21 //无法访问基类的私有成员
22protected:
23 int y;
24private:
25 int x;
26};
27
28int main()
29{
30 Base* base = new Child();//ok
31 Child child;
32 child.GetId(); //派生类的对象可以访问派生类继承下来的公有成员
33 //child.GetNum(); //无法访问继承下来的保护成员GetNum()
34 child.GetCId();
35 child.GetCNum(); //派生类对象可以访问派生类的公有成员
36 //child.x;
37 //child.y; //无法访问派生类的保护成员y和私有成员x
38 return 0;
39}
2保护继承
保护继承中,基类的公有成员和保护成员被派生类继承后变成保护成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象不能访问派生类继承基类的公有成员,保护成员和私有成员。
1class Child : protected Base
2{
3public:
4 Child() : Base(7) {;}
5 int GetCId() {return GetId();} //可以访问基类的公有成员和保护成员
6 int GetCNum() {return GetNum();}
7protected:
8 int y;
9private:
10 int x;
11};
12
13int main()
14{
15 Base* base = new Child();// not ok
16 Child child;
17 //child.GetId();//派生类对象访问不了继承的公有成员,因为此时保护继承时GetId()已经为 protected类型
18 //child.GetNum(); //这个也访问不了
19 child.GetCId();
20 child.GetCNum();
21 return 0;
22}
3私有继承
私有继承时,基类的公有成员和保护成员都被派生类继承下来之后变成私有成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。派生类的对象不能访问派生类继承基类的公有成员,保护成员和私有成员。
1class Child : private Base
2{
3public:
4 Child() : Base(7) {;}
5 int GetCId() {return GetId();} //可以访问基类的公有成员和保护成员
6 int GetCNum() {return GetNum();}
7protected:
8 int y;
9private:
10 int x;
11};
12
13int main()
14{
15 Base* base = new Child();// not ok
16 Child child;
17 //child.GetId();//派生类对象访问不了继承的公有成员,因为此时私有继承时GetId()已经为 private类型
18 //child.GetNum(); //派生类对象访问不了继承的保护成员,而且此时私有继承时GetNum()已经为 private类型
19 child.GetCId();
20 child.GetCNum();
21 return 0;
22}