考试网 >> IT认证 >> 水平 >> 程序员 >> C++箴言:绝不在构造或析构期调用虚函数

C++箴言:绝不在构造或析构期调用虚函数

发布时间:2006-06-28 02:56     点击:
分页:[1] 2 3  下一页

 你不应该在构造或析构期间调用虚函数,因为这样的调用不会如你想象那样工作,而且它们做的事情保证会让你很郁闷。如果你转为 Java 或 C# 程序员,也请你密切关注本文,因为在 C++ 急转弯的地方,那些语言也紧急转了一个弯。

  假设你有一套模拟股票处理的类层次结构,例如,购入流程,出售流程等。对这样的处理来说可以核查是非常重要的,所以随时会创建一个 Transaction 对象,将这个创建记录在核查日志中是一个适当的要求。下面是一个看起来似乎合理的解决问题的方法:

class Transaction { // base class for all

 public: // transactions

  Transaction();

  virtual void logTransaction() const = 0; // make type-dependent

  // log entry

  ...

};

Transaction::Transaction() // implementation of

{

 // base class ctor

 ...

 logTransaction(); // as final action, log this

} // transaction

class BuyTransaction: public Transaction {

 // derived class

 public:

  virtual void logTransaction() const; // how to log trans-

  // actions of this type

  ...

};

class SellTransaction: public Transaction {

// derived class

public:

 virtual void logTransaction() const; // how to log trans-

 // actions of this type

...

};

  考虑执行这行代码时会发生什么:

BuyTransaction b;

  同样的原因也适用于析构过程。一旦派生类析构函数运行,这个对象的派生类数据成员就被视为未定义的值,所以 C++ 就将它们视为不再存在。在进入基类析构函数时,对象就成为一个基类对象,C++ 的所有配件——虚函数,dynamic_casts 等——都如此看待它。

在构造函数和析构函数中调用虚函数的问题并不总是如此容易被察觉。如果 Transaction 有多个构造函数,每一个都必须完成一些相同的工作,好的软件工程为避免代码重复,会将共用的初始化代码,包括对 logTransaction 的调用,放入一个私有的非虚的初始化函数,叫做 init:

分页:[1] 2 3  下一页
版权申明:未经书面授权请勿转载本站信息!!作品版权归所属媒体与作者所有!!
发表评论: 匿名发表 用户名: 查看评论
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容
本站提醒:不要进行人身攻击。谢谢配合。
在本站搜索相关信息
2003-2005 Ksw123.com All Rights Reserved. - TOP
Copyright © 2006 Ksw123.com. All rights reserved.中国考题网 版权所有