权限对继承的影响
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
基类成员类型 | public 继承 | protected 继承 | private 继承 |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | 不可访问 | 不可访问 | 不可访问 |
解释
public
继承:基类的public
成员在派生类中仍然是public
的,protected
成员仍然是protected
的。基类的private
成员在派生类中不可访问protected
继承:基类的public
和protected
成员在派生类中都变成protected
的。基类的private
成员在派生类中不可访问private
继承:基类的public
和protected
成员在派生类中都变成private
的。基类的private
成员在派生类中不可访问。
无论继承类型如何,基类的 private 成员始终不可直接在派生类中访问。
访问权限
#include <iostream>
using namespace std;
class Vehicle // 交通工具、车 抽象的概念
{
public:
string type;
string contry;
string color;
double price;
int numOfWheel;
protected:
int protecteData;
private:
int privateData;
public:
void run()
{
cout << "车跑起来了" << endl;
}
void stop();
};
//私有继承测试
class TestClass : private Vehicle{
public:
void tsetFunc(){
price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用
}
};
class Bickle : public Vehicle
{
public:
void testFunc()
{
protecteData = 10;
}
};
class Truck : protected Vehicle
{
public:
void testFunc()
{
type = "数据测试";
protectedData = 10; //保持公有权限
privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。
}
};
class Roadster : public Vehicle // 跑车,也是抽象,比父类感觉上范围缩小了点
{
public:
int stateOfTop;
void openTopped();
void pdrifting();
};
int main()
{
Roadster ftype;
ftype.type = "宝马五系";
ftype.run();
Bickle bike;
bike.type = "山地";
bike.run();
TestClass test;
test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限
Truck t;
t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限
t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限
Roadster ftype;
return 0;
}