C++中public、protected、private三种权限继承详解
C++中public、protected、private三种权限继承详解
先看一下C++在继承中的访问权限
权限/作用域 | 全局 | 派生类 | 当前类 |
---|---|---|---|
private | ✖ | ✖ | ✔ |
protected | ✖ | ✔ | ✔ |
public | ✔ | ✔ | ✔ |
public
public
继承是一种最简单的继承,基类的成员在派生类中保持原有的权限不会被更改。
public继承示例:
#include <iostream>
using namespace std;
/*
公有继承Test.
*/
class Father
{
//基类的私有变量
private:
void test()
{
cout << "Father's Private." << endl;
}
//基类的保护变量
protected:
void test1()
{
cout << "Father's Protected" << endl;
}
//基类的公共变量
public:
void test2()
{
cout << "Father's Public" << endl;
}
};
//基类的派生类: 共有继承
class Son:public Father
{
public:
//派生类的成员
void son_func()
{
test1(); //基类的protect.
test2(); //基类的public.
}
};
//基类派生类的派生类
class Grandson:public Son
{
public:
void grandson_func()
{
test1();
test2();
}
};
int main()
{
//测试:基类的派生类Son
Son s;
//s.test1(); //子类的对象也是只能够访问到基类的public成员
s.test2();
s.son_func(); //派生类的成员可以访问基类protected和public成员
cout << "-------- This is a dividing line. --------" << endl;
//测试:基类派生类的子类Grandson
Grandson g;
//g.test1(); //跟上面是一个原因
g.test2();
g.grandson_func();
return 0;
}
运行结果如下:
private
private
继承在派生类中将基类的成员权限转换为private
,派生类的成员可以访问基类的private
和protected
成员,但是派生类的对象不可以访问基类的所有成员
private继承示例:
#include <iostream>
using namespace std;
/*
私有继承Test.
总结: 私有继承,基类的成员变为private被隐藏,派生类的对象不可访问基类的任何成员,
但是派生类的成员可以访问基类的public和protect成员,但是如果进一步继承的话,
派生类将不能够访问基类的任何成员.
*/
class Father
{
//基类的私有变量
private:
void test()
{
cout << "Father's Private." << endl;
}
//基类的保护变量
protected:
void test1()
{
cout << "Father's Protected" << endl;
}
//基类的公共变量
public:
void test2()
{
cout << "Father's Public" << endl;
}
};
//基类的派生类: 私有继承
class Son:private Father
{
public:
//派生类的成员
void son_func()
{
//私有继承,派生类的成员可以访问基类的public和protect成员
test1(); //基类的protect.
test2(); //基类的public.
}
};
//基类派生类的派生类
class GrandSon:private Son
{
/*
私有继承的再一步继承,派生类将不能访问基类的任何成员
派生类的成员也不可以访问
*/
// void grandson_func()
// {
// test1();
// test2();
// }
};
int main()
{
//测试:基类的派生类Son
Son s;
//s.test(); Error.私有继承派生类的对象不能够访问基类的任何成员
s.son_func(); //派生类的成员可以访问基类protected和public成员
return 0;
}
运行结果如下:
protected
·
protect
将基类的成员权限转换为protected
,派生类的成员可以访问基类的private
和protected
成员,但是派生类的对象不可以访问基类的所有成员,基本跟private
一致
#include <iostream>
using namespace std;
/*
保护继承Test.
总结: 保护继承,基类的成员变为protected,private成员被隐藏,派生类的对象不可访问
基类的任何成员,但是派生类的成员可以访问基类的public和protect成员,派生类还
可以在进一步继承
*/
class Father
{
//基类的私有变量
private:
void test()
{
cout << "Father's Private." << endl;
}
//基类的保护变量
protected:
void test1()
{
cout << "Father's Protected" << endl;
}
//基类的公共变量
public:
void test2()
{
cout << "Father's Public" << endl;
}
};
//基类的派生类: 保护继承
//经过当前次继承之后,再往下继承得时候基类的成员属性都是按照protect属性往下继承的
class Son:protected Father
{
public:
//派生类的成员
void son_func()
{
//私有继承,派生类的成员可以访问基类的public和protect成员
test1(); //基类的protect.
test2(); //基类的public.
}
};
//基类派生类的派生类
class GrandSon:protected Son
{
/*
保护继承的再一步继承,派生类的派生类的成员同样可以访问基类
的public和protect成员
*/
public:
void grandson_func()
{
test1();
test2();
}
};
int main()
{
//测试:基类的派生类Son
Son s;
//s.test(); Error.保护继承派生类的对象不能够访问基类的任何成员
s.son_func(); //派生类的成员可以访问基类protected和public成员
cout << "-------- This is a dividing line. --------" << endl;
//测试:基类派生类的子类Grandson
GrandSon g;
///g.test();
//g.test2(); Error.保护继承派生类的在继承类的对象不能够访问基类的任何成员
g.grandson_func();
return 0;
}
运行结果如下:
总结
-
public
继承不会改变基类的成员的访问权限 -
private
继承使得基类所有成员在派生类的访问权限变为private
,派生类的成员可以访问基类的public
和protected
成员,但是派生类的对象不可以访问基类的任何成员,并且如果再继承的话,派生类的子类的成员也不能访问基类的成员 -
protect
继承使得基类成员在派生类的访问权限变为protected
,派生类的成员可以访问基类的public
和protected
成员,但是派生类的对象不可以访问基类的任何成员,它可以再向下继承,相当于把基类的成员属性一直按照protected
向下继承 -
注意:基类
private
属性的成员永远不能被访问
简单来说:protect
继承和private
继承除了在再继承方面有区别,其他的可以认为是一样。