You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中public继承与默认private继承的区别是什么?

C++中默认继承与public继承的差异分析

当然有差异啦!而且差异还不小,核心在于C++对class定义的基类有默认继承规则,咱们一步步拆解:

首先得明确一个基础规则:当基类是用class关键字定义时,派生类的默认继承方式是private继承;如果基类是struct定义的,默认才是public继承。所以你写的class Triangle : Shape,本质上等价于class Triangle : private Shape,和显式的public Shape继承在访问权限、类型转换等方面都有明显区别:

1. 成员访问权限的差异

  • 用public Shape继承时:基类的public成员在派生类中保持public属性,protected成员保持protected属性。外部代码可以直接通过派生类对象调用基类的public成员。
  • 用默认private继承时:基类的public和protected成员在派生类中都会被降级为private属性。外部代码完全无法通过派生类对象访问基类的任何成员,哪怕是基类原本对外暴露的public接口。

2. 类型转换的差异

  • public继承是标准的is-a(是一种)关系,派生类对象可以隐式转换为基类的指针或引用,比如Shape* ptr = new Triangle;这种写法是合法的,编译器会自动处理转换。
  • private继承则不支持这种隐式转换,因为从外部视角看,派生类和基类没有公开的继承关系,所以Shape* ptr = new Triangle;会直接触发编译错误。

3. 后续派生的扩展性差异

  • 如果后续有其他类继承Triangle,在public继承Shape的情况下,新的派生类还能访问Shape的protected成员(因为这些成员在Triangle中是protected的)。
  • 但如果是private继承Shape,Shape的所有成员在Triangle里都是private的,后续的派生类完全无法访问Shape的任何成员,相当于把基类的接口彻底封装在了Triangle内部。

举个直观的代码例子帮你理解:

class Shape {
public:
    void draw() {} // 基类的public成员函数
protected:
    int edgeCount = 3; // 基类的protected成员
};

// public继承的Triangle
class TrianglePub : public Shape {};

// 默认private继承的Triangle
class TrianglePri : Shape {};

int main() {
    TrianglePub tp;
    tp.draw(); // 合法!draw在TrianglePub中是public
    Shape* s_ptr = &tp; // 合法!隐式转换为基类指针

    TrianglePri tpri;
    tpri.draw(); // 错误!draw在TrianglePri中是private,外部无法调用
    Shape* s_ptr2 = &tpri; // 错误!无法隐式转换

    return 0;
}

内容的提问来源于stack exchange,提问作者PeePeePooPoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:44:40