c++中公有继承和私有继承的区别

c++中公有继承和私有继承的区别

在C++中,公有继承(public inheritance)和私有继承(private inheritance)是两种不同的继承方式,它们在访问权限和派生类与基类之间的关系上有所不同。以下是它们的详细说明:

公有继承(Public Inheritance):

  1. 访问权限

    • 基类的公有成员在派生类中保持为公有(public)成员。
    • 基类的受保护成员在派生类中保持为受保护(protected)成员。
    • 基类的私有成员在派生类中不可访问。
  2. 派生类对基类成员的访问

    • 派生类可以直接访问基类的公有和受保护成员。
    • 派生类不能直接访问基类的私有成员。
  3. 派生类对外界的接口

    • 派生类可以将从基类继承的公有成员暴露给外界,因为它们保持为公有成员。
  4. 派生类类型与基类类型的关系

    • 公有继承表示"是一个"关系,即派生类对象可以被视为基类对象,可以用来替代基类对象。

私有继承(Private Inheritance):

  1. 访问权限

    • 基类的所有成员在派生类中都变为私有成员。
    • 基类的公有、受保护和私有成员在派生类中都变为私有成员。
  2. 派生类对基类成员的访问

    • 派生类可以直接访问基类的所有成员,因为它们都变为了私有成员。
  3. 派生类对外界的接口

    • 派生类不能将从基类继承的任何成员暴露给外界,因为它们都变为了私有成员。
  4. 派生类类型与基类类型的关系

    • 私有继承不表示"是一个"关系,派生类对象不能直接替代基类对象,因为对外部来说,派生类对象并不是基类对象。

示例代码:

cpp 复制代码
class Base {
public:
    int publicVar;
protected:
    int protectedVar;
private:
    int privateVar;
};

// 公有继承
class DerivedPublic : public Base {
    // DerivedPublic 从 Base 继承了 publicVar 和 protectedVar
    // privateVar 在 DerivedPublic 中不可访问
};

// 私有继承
class DerivedPrivate : private Base {
    // DerivedPrivate 从 Base 继承了 publicVar、protectedVar 和 privateVar
    // 但它们在 DerivedPrivate 中都变为了私有成员
};

int main() {
    DerivedPublic objPublic;
    objPublic.publicVar = 10; // 合法,因为 publicVar 是公有成员
    objPublic.protectedVar = 20; // 合法,因为 protectedVar 是受保护成员

    DerivedPrivate objPrivate;
    objPrivate.publicVar = 10; // 非法,因为 publicVar 在 DerivedPrivate 中是私有成员
    objPrivate.protectedVar = 20; // 非法,因为 protectedVar 在 DerivedPrivate 中是私有成员
    return 0;
}
相关推荐
newxtc1 分钟前
【猿辅导-注册安全分析报告-无验证方式导致安全隐患】
开发语言·selenium·安全·yolo·安全爆破
张人玉4 分钟前
c#WPF基础知识
开发语言·c#·wpf
AA陈超12 分钟前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-09 玩家等级与战斗接口
c++·游戏·ue5·游戏引擎·虚幻
·白小白26 分钟前
力扣(LeetCode) ——118.杨辉三角(C++)
c++·算法·leetcode
tongsound30 分钟前
libmodbus 使用示例
linux·c++
std787939 分钟前
Rust 与 Go – 比较以及每个如何满足您的需求
开发语言·golang·rust
报错小能手1 小时前
python(入门)map内置函数及import模块导入,as别名
开发语言·人工智能·python
梵得儿SHI1 小时前
Java 反射机制实战:对象属性复制与私有方法调用全解析
java·开发语言·java反射机制的实际应用·对象属性复制·反射调用私有方法·私有字段·类型兼容性和敏感字段忽略
sulikey1 小时前
C++的STL:深入理解 C++ 的 std::initializer_list
开发语言·c++·stl·list·initializerlist·c++标准库
代大大1 小时前
sciter.js 之cpp使用教程(1)
c++·前端框架