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的成员变量尚未初始化.

你可能感兴趣的:(C++,c,C#)