`
isiqi
  • 浏览: 16745234 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Item 35 考虑虚函数的替代者

阅读更多

● NVI: Non-Virtual Interface

NVI的优点:用一个不能被子类重定义的函数,做一些预处理、后处理。比如:互斥锁、日志、验证约束条件,等等。

● 函数指针

优先:对象实例和派生类对象,可使用各种实现,也可在运行时随意改变。
缺点:函数只能访问类内部的公有成员。这是一种隐患:可能以后需要访问私有成员,那么只有弱化类的封装。比如,把函数声明为友元;为私有成员提供访问函数。

● tr1::function比上面的函数指针更灵活、限制更少:
1> 返回值不一定是int,与其兼容即可
2> 可以是function对象
3> 可以是类的成员函数

● Strategy模式
优点:只要熟悉这个模式,就可以随时添加新算法。

分享到:
评论

相关推荐

    more effective c++

    #### Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 - **区别**:抛出异常会导致控制流跳转,而传递参数或调用虚函数则按照正常流程执行。 - **注意事项**:在设计程序时需要考虑...

    More Effective C++

    理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 (Item 12) - **差异**: - 抛出异常通常涉及更多的开销,包括堆栈展开、异常对象的创建和销毁等。 - 传递参数或调用虚函数相对简单,仅...

    more-effective-c++-cn.pdf

    **5.4 Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异** - **差异**: - 抛出异常会中断当前的执行路径,并转移到异常处理器。 - 传递参数和调用虚函数则遵循正常的控制流。 - **...

    More_Effective_C++

    **5.4 Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异** - **差异**:异常处理与其他控制流转移机制(如函数调用)在实现上存在根本区别。 - **注意事项**:理解这些机制之间的差异...

    侯捷译Scott Meyers的 More Effecitve C++

    - **Item 12: 理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异** - 抛出异常与常规控制流有所不同,理解这些差异有助于编写更健壮的代码。 - **Item 13: 通过引用(REFERENCE)捕获异常** -...

    More.Effective.C++简体中文版

    - **ITEM M12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异** - **区别说明**:异常处理机制与其他控制流程机制有着本质的不同。 - **应用场景**:异常处理适用于错误情况下的流程控制,...

    C++面试整理.zip

    - **封装、继承与多态**:理解这三个面向对象编程的基本特征,以及虚函数和纯虚函数在实现多态中的作用。 - **模板**:学习函数模板和类模板,掌握泛型编程,提高代码复用性。 3. **内存管理** - **动态内存分配...

    net面试题目荟萃.doc

    6. B/S系统中传递变量值的替代方法:当不能使用Session、Cookie、Application时,还可以使用QueryString、Server.Transfer、Cache、HttpContext.Item、文件和数据库等。 7. 遍历TextBox控件并清空值:通过控件集合...

    .NET面试试题

    - 事件是基于委托的特殊类型,用于实现发布-订阅模式,确保只有订阅者可以触发事件。 5. `override`与重载的区别: - 重载(Overloading):在同一作用域内,方法名相同但参数列表不同(参数数量、类型或顺序不同...

    .NET经典面试题

    6. 传递变量值的替代方法:在B/S架构中,若不使用Session、Cookie和Application,仍有许多其他选择,如URL参数(QueryString)、`Server.Transfer`、Cache、`HttpContext.Item`、文件存储、数据库存储。 7. 遍历并...

    ASP.NET面试问题集结

    string[] arrA = new string[] { "item1", "item2", "item3" }; ArrayList arrB = new ArrayList(); foreach (string a in arrA) { arrB.Add(a); } foreach (string b in arrB) { Response.Write(b); } ``` - *...

    .net/SQL面试题

    - **事件**是基于委托的封装,提供了一种更安全的方式来通知对象状态的变化,避免了外部对象对发送者对象的直接访问。 ### 5. Override与重载的区别 - **重载(Overloading)**是指在同一个类中定义多个同名但参数...

Global site tag (gtag.js) - Google Analytics