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;
}
相关推荐
starzy199015 分钟前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
zhanghaha13141 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain2 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕2 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
zhanghaha13142 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#
Rabitebla10 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
麦麦麦当劳大王10 小时前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript
starzy199010 小时前
深入理解Scala Map:从实现原理到工程实践
开发语言·后端·scala
只睡四小时11 小时前
Three.js Sub-tick:漏判 60.7%→0
开发语言·javascript·性能优化·ecmascript·游戏开发·three.js·碰撞检测
码农小河6612 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库