二、面向对象编程(OOP)
二、面向对象编程OOP共18项1.C/C中面向对象的相关知识2.什么是纯虚函数抽象类3.什么是多态多态有什么作用4.重载和覆盖有什么区别5.C中类默认有哪些成员函数6.C中哪一种成员变量可以在一个类的实例之间共享7.继承层次中为什么基类析构函数是虚函数8.面向对象技术的基本概念是什么三个基本特性是什么9.为什么构造函数不能为虚函数10.虚函数是什么为什么不能把所有函数设为虚函数11.什么是多态多态有什么作用12.什么是公有继承、受保护继承、私有继承13.什么是虚指针14.C如何阻止一个类被实例化15.类使用static成员的优点如何访问16.一个父类写了一个virtual函数如果子类覆盖它的函数不加virtual也能实现多态在子类的空间里有没有父类的这个函数或者父类的私有变量17.多态实现方式是什么18.C对象模型、虚表、虚指针在插件化推理框架中有什么意义结论先行这18个问题串起了 C 面向对象编程的“三板斧”封装、继承、多态。封装决定类/对象如何隐藏状态、暴露接口继承实现代码复用与“是一个is-a”关系多态让基类指针能调用子类实现核心实现靠虚函数 虚表 虚指针。在插件化推理框架中这些机制正好用来定义稳定的抽象算子/后端接口抽象类虚函数运行时通过虚表动态分派到不同插件实现实现“接口不变、实现可插拔”。逐条简明解释1. C/C 中面向对象的相关知识C 语言本身不是面向对象语言但可以用结构体函数指针模拟封装与多态。C 原生支持类、对象、封装、继承、多态、虚函数、抽象类、模板等。核心是把数据 操作数据的函数绑定在一起。2. 纯虚函数与抽象类virtual void foo() 0; // 纯虚函数含有纯虚函数的类叫抽象类不能直接实例化只能被继承强制子类实现接口。类似于 Java 的interface或 Python 的抽象基类。3. 什么是多态有什么作用多态就是“同一接口不同表现”。编译时多态函数重载、模板。运行时多态虚函数 基类指针/引用。作用降低耦合、增强扩展性写通用代码时不必关心具体子类类型。4. 重载Overload与覆盖Override的区别维度重载覆盖发生范围同一作用域内基类与派生类之间函数签名必须不同参数列表不同必须相同除协变返回关键字不需要virtual基类函数必须virtual绑定时机编译期运行期5. C 类默认有哪些成员函数编译器会在需要时自动生成默认构造函数拷贝构造函数拷贝赋值运算符移动构造函数C11移动赋值运算符C11析构函数C11 起可用 default显式默认、 delete显式删除。6. 哪种成员变量可在类实例之间共享static成员变量。所有对象共用同一份存储不属于某个对象需在类外定义并初始化。class A { static int count; }; int A::count 0; // 类外初始化7. 为什么基类析构函数应为虚函数如果基类指针指向派生类对象用delete base_ptr释放时析构函数不是虚函数 → 只调用基类析构派生类资源泄漏。析构函数是虚函数 → 通过虚表正确调用派生类析构再调基类析构。原则有虚函数的类、或会被多态删除的基类析构函数必须为virtual。8. 面向对象的基本概念与三大特性基本概念类、对象、封装、继承、多态、消息传递。三大特性封装、继承、多态。9. 为什么构造函数不能为虚函数构造时对象类型还未完整虚表尚未构建完成无法动态分派。虚函数调用依赖虚指针而虚指针正是在构造函数中初始化的。从语义上派生类构造需要先构造基类部分基类构造期间并不知道自己是派生类。10. 虚函数是什么为什么不能把所有函数设为虚函数虚函数是在基类声明为virtual、允许派生类重写并通过基类指针动态调用的成员函数。不能全部设为虚函数的原因性能开销每次调用需查虚表有间接跳转和缓存未命中。对象体积每个对象额外增加虚指针。设计语义很多函数不需要多态强制虚函数破坏内联和静态优化。11. 同 3略。一句话接口统一实现可变扩展方便。12. 公有、受保护、私有继承继承方式基类 public 成员基类 protected 成员基类 private 成员语义public继承publicprotected不可见is-a 关系protected继承protectedprotected不可见实现细节复用private继承privateprivate不可见has-a / 实现继承默认class私有继承struct公有继承。13. 什么是虚指针每个含虚函数的类对象编译器会隐式插入一个虚指针vptr指向该类的虚函数表vtable。通过它实现运行时多态。14. C 如何阻止一个类被实例化构造函数设为private或protected单例、工厂常用。声明纯虚函数使其成为抽象类。C11 起可用 delete删除构造函数。class NonInstantiable { public: NonInstantiable() delete; };15. static 成员的优点与访问方式优点所有对象共享节省内存。可作为全局状态/计数器作用域限定在类内避免命名污染。类级行为不依赖对象实例。访问ClassName::staticVar; // 推荐 obj.staticVar; // 也可通过对象访问但语义上是类共享16. 子类覆盖父类 virtual 函数时不加 virtual能否多态子类空间里有没有父类函数/私有变量能实现多态。在 C 中只要基类函数是virtual派生类中同名同签函数会自动成为虚函数建议显式加override。子类对象空间里包含父类子对象父类的非静态成员变量都会存在包括私有变量只是派生类无法直接访问。父类的虚函数在 vtable 中会被子类版本覆盖/替换但父类自己的实现仍作为独立函数存在可通过作用域调用Base::foo()。17. 多态的实现方式静态多态函数重载、运算符重载、模板编译期确定。动态多态虚函数 虚表 虚指针运行期确定。18. C 对象模型、虚表、虚指针在插件化推理框架中的意义插件化推理框架常见设计定义抽象基类Op、Backend、InferenceEngine包含纯虚接口。各后端/算子以动态库.so/.dll形式实现并继承这些基类。主程序通过dlopen/dlsym加载插件返回基类指针/智能指针。虚表 虚指针保证运行期正确分派到插件具体实现主程序无需重新编译即可接入新后端。意义解耦核心框架与具体推理实现分离。可扩展新增模型格式或硬件后端只需新增插件。统一接口同一套推理 API 适配 CPU/GPU/NPU 等多种设备。这些问题之间的联系它们共同描绘了 C OOP 的完整图景类与对象封装继承多态虚函数虚表 vtable虚指针 vptr抽象类/接口插件化框架封装通过访问控制和构造函数管理对象状态。继承复用并扩展基类。多态让继承体系“活”起来而多态依赖vptr vtable。抽象类 虚析构为插件/框架提供安全、稳定的扩展边界。static 成员则处理“类级别”的共享状态与实例级状态互补。掌握这些你就能设计出像插件化推理框架这样“高内聚、低耦合、可扩展”的 C 系统。