信息发布网站建设wordpress 图册
信息发布网站建设,wordpress 图册,万能搜索,企业网站维护建设ppt文章目录C中的两大世界#xff1a;面向对象与泛型编程特性对比详解两种接口与多态面向对象的世界#xff1a;显式接口与运行时多态泛型编程的世界#xff1a;隐式接口与编译时多态核心要点与演进请记住#xff1a;1. classes 和 templates 都支持接口#xff…文章目录C中的两大世界面向对象与泛型编程特性对比详解两种接口与多态面向对象的世界显式接口与运行时多态泛型编程的世界隐式接口与编译时多态核心要点与演进请记住1. classes 和 templates 都支持接口interfaces和多态polymorphism。2. 对 classes 而言接口是显式的explicit以函数签名为中心。多态则是通过 virtual 函数发生于运行期。3. 对 template 参数而言接口是隐式的implicit奠基于有效表达式。多态则是通过 template 具现化和函数重载解析function overloading resolution发生于编译期。C中的两大世界面向对象与泛型编程《Effective C》第41条揭示了C中并存的两大世界一个是我们熟悉的面向对象世界以类和继承为基础另一个是功能强大的模板泛型编程世界。两者都支持接口和多态但实现方式和理念截然不同。特性对比特性面向对象类 / 显式接口与运行时多态泛型编程模板 / 隐式接口与编译时多态接口形式显式接口通过函数签名明确定义在头文件中可见隐式接口由模板代码中对类型参数的有效表达式约束多态时机运行时通过虚函数表vtable动态绑定编译时通过模板实例化和函数重载解析实现核心关系“是一个”is-a基于继承层次“行为像”behaves-like-a鸭子类型基于有效操作错误检测编译时检查函数签名运行时可能发生未定义行为编译时检查所有表达式有效性详解两种接口与多态面向对象的世界显式接口与运行时多态在这个世界里接口是显式的。它明确规定了类有哪些成员函数包括名称、参数类型、返回类型通常可以在类的头文件定义中直接看到。// 显式接口示例: 一个简单的抽象基类classDrawable{public:virtualvoiddraw()const0;// 纯虚函数显式定义了接口virtual~Drawable()default;};多态通过虚函数在运行时实现。当你使用基类的指针或引用调用一个虚函数时具体调用哪个函数实现是由该指针或引用所指向的实际对象类型在运行时决定的。Circle circle;Rectangle rect;Drawable*shape1circle;Drawable*shape2rect;shape1-draw();// 运行时决定调用 Circle::draw()shape2-draw();// 运行时决定调用 Rectangle::draw()泛型编程的世界隐式接口与编译时多态在模板编程中接口是隐式的。它并不要求类型 T 必须继承自某个特定基类而只要求类型 T 的对象能进行模板代码中所用的所有操作。这种约束基于有效的表达式也被称为鸭子类型——如果它走起路来像鸭子叫起来像鸭子那它就可以被当作鸭子。// 隐式接口示例: 一个简单的模板函数templatetypenameTvoiddrawObject(constTobj){obj.draw();// 隐式接口: 要求类型 T 必须有一个可调用的 draw() 方法}多态则通过模板实例化和函数重载解析在编译时完成。编译器会为每个用于实例化模板的具体类型生成一份对应的代码。调用哪个函数或使用哪个操作符在编译时就根据类型确定下来了。// 编译时多态示例: 模板实例化与函数重载Circle circle;Robot robot;// 假设Robot也有draw()方法但与circle无继承关系drawObject(circle);// 编译器为 TCircle 生成特定代码调用 Circle::draw()drawObject(robot);// 编译器为 TRobot 生成特定代码调用 Robot::draw()核心要点与演进理解这两种范式区别的关键在于显式接口关于类型强调你是什么才能做什么。隐式接口关于表达式强调你能做什么就是什么。现代C特别是C20引入了概念它能让你为模板参数必须满足的隐式接口约束赋予一个显式的名称大大提升了代码的可读性和错误信息的友好度。// C20 概念让隐式接口更显式templatetypenameTconceptDrawablerequires(T obj){{obj.draw()}-std::same_asvoid;// 显式地要求有 draw 方法};templateDrawable T// 使用概念意图更清晰voidrender(constTobj){obj.draw();}这两种范式是C强大的基石理解它们能让你在面向对象设计和泛型编程之间做出更合适的选择。