一 C++语法
1.1 c++中Public/Private/Protected变量的继承
public
、private
、protected
是C++中的访问修饰符,用来指定类成员的访问权限。
public
:成员在任何地方都是可访问的。private
:成员只能被类的成员函数、友元函数或类的实例访问。protected
:成员只能被类的成员函数、友元函数、派生类的成员函数或派生类的实例访#include <iostream> using namespace std; // 基类 class Base { public: int publicData; // 公有成员 protected: int protectedData; // 保护成员 private: int privateData; // 私有成员 }; // 派生类 class Derived : public Base { public: void accessMembers() { publicData = 1; // 直接访问公有成员 protectedData = 2; // 直接访问保护成员 // privateData = 3; // 错误!无法直接访问私有成员 } }; int main() { Derived d; d.publicData = 5; // 正确:公有成员在类外可访问 // d.protectedData = 6; // 错误:保护成员在类外不可访问 // d.privateData = 7; // 错误:私有成员在类外不可访问 return 0; }
在这个例子中,
Derived
类继承自Base
类。Derived
类的成员函数accessMembers
可以访问Base
类的公有成员和保护成员,但不能直接访问私有成员。在main
函数中,我们只能访问Derived
对象的公有成员,不能访问保护成员和私有成员。
1.2 c++中Public/Private/Protected成员函数的继承
成员函数的继承访问是非常灵活和复杂的,请看下面的示例:
#include <iostream>
using namespace std;
// 基类
class Base {
public:
void publicFunc() {
cout << "Public function in Base." << endl;
}
protected:
void protectedFunc() {
cout << "Protected function in Base." << endl;
}
private:
void privateFunc() {
cout << "Private function in Base." << endl;
}
};
// 派生类,使用public继承
class DerivedPublic : public Base {
public:
void accessMembers() {
publicFunc(); // 可以访问公有成员函数
protectedFunc(); // 可以访问保护成员函数
// privateFunc(); // 错误!无法访问私有成员函数
}
};
// 派生类,使用protected继承
class DerivedProtected : protected Base {
public:
void accessMembers() {
publicFunc(); // 可以访问公有成员函数,但在DerivedProtected外部将不可访问
protectedFunc(); // 可以访问保护成员函数
// privateFunc(); // 错误!无法访问私有成员函数
}
};
// 派生类,使用private继承
class DerivedPrivate : private Base {
public:
void accessMembers() {
publicFunc(); // 可以访问公有成员函数,但在DerivedPrivate外部将不可访问
protectedFunc(); // 可以访问保护成员函数
// privateFunc(); // 错误!无法访问私有成员函数
}
};
int main() {
DerivedPublic dp;
dp.publicFunc(); // 正确:公有成员函数在类外可访问
// dp.protectedFunc(); // 错误:保护成员函数在类外不可访问
// dp.privateFunc(); // 错误:私有成员函数在类外不可访问
DerivedProtected dp2;
// dp2.publicFunc(); // 错误:公有成员函数在protected继承下,类外不可访问
// dp2.protectedFunc(); // 错误:保护成员函数在类外不可访问
DerivedPrivate dp3;
// dp3.publicFunc(); // 错误:公有成员函数在private继承下,类外不可访问
// dp3.protectedFunc(); // 错误:保护成员函数在类外不可访问
return 0;
}
在这个例子中,基类Base有三个成员函数:publicFunc、protectedFunc和privateFunc,它们分别是公有、保护和私有的。
请仔细阅读以下说明:
然后,我们定义了三个派生类DerivedPublic、DerivedProtected和DerivedPrivate,它们分别使用public、protected和private继承Base类。
在DerivedPublic中,所有从Base继承来的公有和保护成员函数都可以在派生类的成员函数内部访问,但私有成员函数无法访问。在类外部,只有公有成员函数可以访问。
在DerivedProtected中,所有从Base继承来的公有和保护成员函数都可以在派生类的成员函数内部访问,但私有成员函数无法访问。在类外部,所有继承来的成员函数都不可访问。
在DerivedPrivate中,情况与DerivedProtected相同,但在类外部,所有继承来的成员函数都不可访问,即使它们在基类中是公有的。
1.3 c++中Public/Private/Protected成员函数和成员变量的继承中权限管理
在C++中,使用public、private、protected继承时,成员函数和成员变量的访问权限管理在本质上是相似的,但有一些细微的差别需要注意。
-
继承类型对成员访问权限的影响:
- public继承:基类的公有成员和保护成员按照原有的访问权限在派生类中保持不变,而基类的私有成员在派生类中不可访问。
- private继承:基类的公有成员和保护成员在派生类中变为私有成员,而基类的私有成员在派生类中仍然不可访问。
- protected继承:基类的公有成员和保护成员在派生类中变为保护成员,而基类的私有成员在派生类中仍然不可访问。
-
成员函数和成员变量的特殊之处:
-
成员函数:无论继承类型如何,派生类的成员函数总是可以访问基类中的公有成员和保护成员(除非这些成员在基类中被声明为不可访问,例如通过私有继承)。私有成员在派生类中始终不可访问。
-
成员变量:成员变量的访问权限受继承类型的影响,与成员函数相同。但是,当通过派生类的对象访问成员变量时,访问权限还受到成员变量在派生类中的声明的影响。
-
-
访问权限的“叠加”效应:
- 当派生类继承自基类时,派生类的成员函数可以访问基类中的公有成员和保护成员(根据继承类型可能有所变化)。但是,当通过派生类的对象访问这些成员时,实际的访问权限是基类中的访问权限和派生类中可能的任何额外声明(如使用
using
声明)的结合。
- 当派生类继承自基类时,派生类的成员函数可以访问基类中的公有成员和保护成员(根据继承类型可能有所变化)。但是,当通过派生类的对象访问这些成员时,实际的访问权限是基类中的访问权限和派生类中可能的任何额外声明(如使用
-
using
声明的作用:- 在派生类中,可以使用
using
声明来改变基类成员的访问权限。例如,如果基类有一个私有成员,派生类无法通过using
声明来直接访问它,但如果基类有一个保护成员,派生类可以使用using
声明将其在派生类中的访问权限提升为公有。
- 在派生类中,可以使用
综上所述,虽然成员函数和成员变量在继承时的访问权限管理在本质上是相似的,但成员函数总是可以访问基类中的公有成员和保护成员(除非这些成员在基类中被声明为不可访问),而成员变量的访问权限还受到通过派生类对象访问时的影响。此外,using
声明可以在派生类中用来改变基类成员的访问权限(但有一些限制)。