C++学习笔记 绝不在构造和析构函数过程中调用virtual函数_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++学习笔记 绝不在构造和析构函数过程中调用virtual函数

C++学习笔记 绝不在构造和析构函数过程中调用virtual函数

 2010/9/19 23:30:10  冇心人  http://superwing.javaeye.com  我要评论(0)
  • 摘要:假设你有个class继承体系,用来塑模股市交易如买进,卖出的订单等等.这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也要创建一笔适当的记录classTransaction{public:Transaction();virtualvoidlogTransansaction()const=0;Transaction::Transaction(){...logTransansaction();}classBuyTransaction:publicTransaction{public
  • 标签:C学习笔记 绝不 构造 析构函数过程 调用virtual函数

假设你有个class继承体系,用来塑模股市交易如买进,卖出的订单等等.这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也要创建一笔适当的记录

class Transaction {
public:
     Transaction();
     virtual void logTransansaction() const = 0;



Transaction::Transaction()
{
   ...
   logTransansaction();
}

class BuyTransaction: public Transaction {
public:
    virtual void logTransaction() const;
    ....
}

class SellTransaction: public Transaction {
public:
    virtual void logTransaction() const;
    ....
}

?现在,当一下这行被执行,会发生什么事:

BuyTransaction b;

?五一地会有一个BuyTransaction构造函数被调用,但是首先Transaction构造函数一定会更早被调用.Transaction构造函数的最后一行调用virtual函数logTransaction,这正是引发惊奇的地方.这时候被调用的logTransaction是Transaction内的版本,不是BuyTransaction内的版本.没错!base class构造期间virtual函数绝不会下降到derived clases阶层.取而代之的是对象的作为像隶属base类型一样.非正式的说法或许比较传神:在base class构造期间,virtual函数不是virtual函数.是因为base class构造函数的执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化.

发表评论
用户名: 匿名