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
相关产品推荐
相关产品推荐

