在C++的面向对象编程中,函数继承是复用基类代码的重要方式,而继承访问权限直接决定了基类中的成员函数能否在派生类中被访问、被调用,是理解继承机制的核心知识点之一。

什么是继承访问权限
继承访问权限指的是当派生类通过不同方式继承基类时,基类中原本的public、protected、private成员函数在派生类中的访问属性变化规则。C++支持三种继承方式:public继承、protected继承、private继承,不同的继承方式会改变基类成员在派生类中的可访问性,其中成员函数作为类的重要组成部分,同样受这套规则约束。
三种继承方式的访问规则
我们可以通过下面的表格快速梳理不同继承方式下,基类各类成员函数在派生类中的访问权限变化:
| 基类成员函数访问权限 | public继承后派生类中的权限 | protected继承后派生类中的权限 | private继承后派生类中的权限 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可访问 | 不可访问 | 不可访问 |
public继承
public继承是最常用的继承方式,它遵循“is-a”的关系,派生类对象可以被当作基类对象使用。在这种继承方式下,基类的public成员函数在派生类中仍然是public的,派生类内部和外部都可以直接调用;基类的protected成员函数变为派生类的protected成员,只能在派生类内部和其子类中访问,外部无法直接调用;基类的private成员函数对派生类完全不可见,无法访问。
下面的代码演示了public继承的访问规则:
#include <iostream>
using namespace std;
// 基类
class Base {
public:
void public_func() {
cout << "Base public function" << endl;
}
protected:
void protected_func() {
cout << "Base protected function" << endl;
}
private:
void private_func() {
cout << "Base private function" << endl;
}
};
// public继承派生类
class DerivedPublic : public Base {
public:
void test() {
public_func(); // 正确,基类public函数在派生类中仍为public,可访问
protected_func(); // 正确,基类protected函数在派生类中为protected,类内可访问
// private_func(); // 错误,基类private函数不可访问
}
};
int main() {
DerivedPublic dp;
dp.public_func(); // 正确,派生类外部可调用public成员函数
// dp.protected_func(); // 错误,protected成员函数外部不可访问
return 0;
}protected继承
protected继承下,基类的public和protected成员函数在派生类中都会变为protected权限,只能在派生类内部和其子类中访问,派生类外部无法直接调用;基类的private成员函数同样不可访问。这种继承方式通常用于“实现继承”场景,不希望派生类的对象被当作基类对象使用。
代码示例:
#include <iostream>
using namespace std;
class Base {
public:
void public_func() {
cout << "Base public function" << endl;
}
protected:
void protected_func() {
cout << "Base protected function" << endl;
}
};
// protected继承派生类
class DerivedProtected : protected Base {
public:
void test() {
public_func(); // 正确,基类public函数变为protected,类内可访问
protected_func(); // 正确,基类protected函数仍为protected,类内可访问
}
};
int main() {
DerivedProtected drp;
// drp.public_func(); // 错误,public_func在派生类中为protected,外部不可访问
return 0;
}private继承
private继承会将基类的public和protected成员函数都变为派生类的private成员,只能在派生类内部访问,派生类的子类和外部都无法访问;基类的private成员函数依然不可访问。这种继承方式相当于将基类的实现完全封装在派生类内部,通常用于组合替代继承的场景。
代码示例:
#include <iostream>
using namespace std;
class Base {
public:
void public_func() {
cout << "Base public function" << endl;
}
protected:
void protected_func() {
cout << "Base protected function" << endl;
}
};
// private继承派生类
class DerivedPrivate : private Base {
public:
void test() {
public_func(); // 正确,基类public函数变为private,类内可访问
protected_func(); // 正确,基类protected函数变为private,类内可访问
}
};
// 派生类的子类
class SubDerived : public DerivedPrivate {
public:
void sub_test() {
// public_func(); // 错误,public_func在DerivedPrivate中为private,子类不可访问
// protected_func(); // 错误,protected_func在DerivedPrivate中为private,子类不可访问
}
};
int main() {
DerivedPrivate drp;
// drp.public_func(); // 错误,public_func在派生类中为private,外部不可访问
return 0;
}继承访问权限的注意事项
- 无论哪种继承方式,基类的private成员函数永远无法被派生类直接访问,只能通过基类提供的public或protected接口间接访问。
- 继承访问权限只影响基类成员在派生类中的可访问性,不会改变基类自身的访问规则,基类内部依然可以正常访问自己的所有成员函数。
- 如果派生类需要重写基类的函数,被重写的函数通常是基类的public或protected成员,private函数无法被重写,因为派生类根本看不到它。
理解继承访问权限的规则,能够帮助我们在设计类的继承关系时,合理选择继承方式,既保证代码的复用性,又能做好封装,避免不必要的访问暴露。
C++函数继承继承访问权限public继承protected继承private继承修改时间:2026-05-29 16:59:08