C++--virtual関数は、コンストラクションおよびコンストラクション関数では呼び出されません.

1421 ワード

C++は虚関数の挙動を規定しているが,実現方法はコンパイラの著者に残されている.
コンパイラが虚関数を処理する方法は、各オブジェクトに非表示メンバーを追加することです.非表示メンバーには、虚関数テーブルとなる関数アドレス配列を指すポインタが保存されます.
このブログでは,虚関数の動作原理を詳細に説明しようとしたわけではない.
しかし、虚関数を使用すると、メモリと実行速度の面で一定のコストがかかります.各オブジェクトはストレージアドレスの空間に大きくなり、大きくなります.各クラスについて、コンパイラは虚関数アドレステーブルを作成します.各関数呼び出しでは、リストにアドレスを検索する追加の操作が必要です.
虚関数の他の知識を見てみましょう.1.コンストラクション関数は虚関数2であってはならない.ベースクラスを行う場合、構造関数は虚関数3であるべきである.友元は虚関数ではないので、友元はクラスメンバーではなく、クラスメンバー関数のみが虚関数です.4.再定義されておらず、虚関数として宣言すべきではない
今、私たちは大きな手を出します!クラスを定義します.
class Transaction
{
public:
    Transaction();
    virtual void logTransaction() const = 0;
    ...
};
Transaction::Transaction()
{
    ...
    Transaction();
}
class BuyTransaction:public Transaction
{
public:
    virtual void logTransaction()const;
    ...
};
class SellTransaction:public Transaction
{
public:
    virtual void logTransaction() const;
};

暴行が来た:
BuyTransaction b;

BuyTransactionコンストラクタが呼び出される前に、ベースクラスTransactionのコンストラクタが呼び出されることは間違いありません.Transactionコンストラクション関数の最後の行は、ダミー関数logTransactionを呼び出します.理性分析:ベースクラス構造中に虚関数は決してサブクラス階層に低下しない.オブジェクトの内部に初期化されていない成分が使用されているようなものです.虚関数はコンパイラによってベースクラスに解析されます.
同じ理屈は構造関数にも適用される.
だから禁物だ!あなたのコンストラクション関数とコンストラクション関数がvirtual関数を呼び出していないことを確認し、彼らが呼び出したすべての関数も同じ制約に従っています.