面向对象设计的核心在于对象作为独立协作主体承担职责并交互,而非仅语法上定义class/struct或实例化对象;需满足封装(private数据+public接口)、继承(明确抽象基类与子类关系)、多态(统一接口不同实现)及对象间消息传递等设计意图。

只看有没有 class 或 struct 定义、有没有对象实例化、有没有用到封装/继承/多态机制,就能基本判断——不是“用了对象”就等于在做面向对象设计。
有没有定义类或结构体,且封装了数据和行为
面向对象设计的起点是抽象出“谁”和“它能做什么”,而不是先写函数。如果代码里只有零散的函数和全局变量,哪怕后面用 struct 存了几条数据,也大概率只是面向过程的包装。
-
class或struct里有private成员 +public成员函数(比如setRadius()和getArea()),说明在刻意隐藏实现、暴露接口——这是封装意图 - 如果
struct全是public成员,没任何函数,只是把几个变量捆在一起(如Point{x, y}),那它本质还是数据容器,不是面向对象的设计单元 - C++ 中
struct默认public,class默认private,这个默认访问级别差异本身就是语言对设计意图的提示
对象是不是被当作独立协作的主体来使用
面向对象设计强调“对象之间发消息”,而不是主函数一路调用到底。关键看控制流是否从一个对象跳转到另一个对象。
- 例如:
order.place();→payment.process();→delivery.dispatch();,每个调用都发生在不同对象上,职责分离清晰 - 反例:
processOrder(order, payment, delivery);这种把所有东西当参数塞进一个函数的做法,仍是面向过程思维——对象只是数据载体,没获得行为主权 - 如果所有操作都围绕
main()展开,对象只在初始化和最后打印时出现一次,那它们只是临时变量,不是设计中的主角
有没有利用继承或虚函数表达“是一种”的关系
继承不是为了复用几行代码,而是建模现实或逻辑中的分类体系。随便抽一个父类出来套个 virtual 不代表就在做面向对象设计。
- 真正体现设计意图的继承:有明确的基类抽象(如
Shape),子类提供具体实现(Circle、Rectangle),且通过Shape*指针统一调用draw()——这时多态才起作用 - 如果子类只是复制父类代码再改两行,或者继承后完全不覆盖虚函数,那继承只是形式,没解决“变化点隔离”问题
- 过度继承(比如为两个只共享一个字段的类硬造一个父类)反而破坏内聚,属于误用,不是面向对象设计
最容易被忽略的是:面向对象设计不是语法达标就行。一个 class 定义得再规范,如果它的对象从不交互、不承担职责、不参与决策,那它只是披着类皮的过程式代码。真正的分水岭不在编译能否通过,而在你写每一行时,心里想的是“这个对象该不该知道这件事”,而不是“我该把这段逻辑塞进哪个函数”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











