在C++继承中,可以通过不同的访问方式从基类派生出子类。
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
在公共模式下从基类创建了一个派生类。或者,也可以在保护或私有模式下派生类。
这 3 个关键字(public、protected 和 private)在 C++ 继承中称为访问说明符。
C++中的公共、保护和私有继承
public、protected和private继承具有以下特点:
- 公共继承使得基类的公共成员在派生类中是公共的,而基类的受保护成员在派生类中仍然是受保护的。
- 受保护继承使基类的公共成员和受保护成员在派生类中受到保护。
- 私有继承使基类的公共成员和受保护成员在派生类中成为私有成员。
Note:派生类无法访问基类的私有成员。
class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class PublicDerived: public Base {
// x公共
// y受保护
// 无法从公共派生访问Z
};
class ProtectedDerived: protected Base {
// x受保护
// y受保护
//无法从受保护派生访问Z
};
class PrivateDerived: private Base {
// x私有
// y私有
// 无法从私有派生访问Z
};
示例 1:C++ 公共继承
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// 用于访问私有成员的函数
int getPVT() {
return pvt;
}
};
class PublicDerived : public Base {
public:
//从基类访问受保护成员的函数
int getProt() {
return prot;
}
};
int main() {
PublicDerived object1;
cout << "Private = " << object1.getPVT() << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.pub << endl;
return 0;
}
结果:
由于 private 和 protected 成员不能从 main() 访问,需要创建公共函数 getPVT() 和 getProt() 来访问它们:
// 错误:成员“Base::pvt”不可访问
cout << "Private = " << object1.pvt;
// 错误:成员“Base::prot”不可访问
cout << "Protected = " << object1.prot;
示例 2:C++ 保护的继承
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// 用于访问私有成员的函数
int getPVT() {
return pvt;
}
};
class ProtectedDerived : protected Base {
public:
// 从基类访问受保护成员的函数
int getProt() {
return prot;
}
// 从基类访问公共成员的函数
int getPub() {
return pub;
}
};
int main() {
ProtectedDerived object1;
cout << "私有无法访问。" << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
结果:
众所周知,受保护的成员不能从类外部直接访问。因此,无法使用 ProtectedDerived 中的 getPVT()。
// 错误:成员“Base::getPVT()”不可访问
cout << "Private = " << object1.getPVT();
// 错误:成员“Base::pub”不可访问
cout << "Public = " << object1.pub;
示例 3:C++ 私有继承
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// 用于访问私有成员的函数
int getPVT() {
return pvt;
}
};
class PrivateDerived : private Base {
public:
// 从基类访问受保护成员的函数
int getProt() {
return prot;
}
// 用于访问私有成员的函数
int getPub() {
return pub;
}
};
int main() {
PrivateDerived object1;
cout << "私有无法访问。" << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
结果:
私有成员不能从类外直接访问。因此,无法使用 PrivateDerived 中的 getPVT()。
// 错误:成员“Base::getPVT()”不可访问
cout << "Private = " << object1.getPVT();
// 错误:成员“Base::pub”不可访问
cout << "Public = " << object1.pub;