3

Bruce Eckel の「Thinking in C++」の助けを借りて C++ を学習します。演習 30 で行き詰まりました。これは次のとおりです。

値によって渡されたオブジェクトへの関数呼び出しが事前バインドされていない場合、仮想呼び出しは存在しない部分にアクセスする可能性があります。これは可能ですか?仮想呼び出しを強制するコードを記述し、これがクラッシュを引き起こすかどうかを確認します。動作を説明するには、オブジェクトを値で渡すときに何が起こるかを調べます。

オブジェクトの仮想関数を呼び出した結果は理解できますが、適切なコンストラクターを呼び出さずにコンパイラーに強制的に実行させる方法は理解できません。

(型変換のために) 適切なコンストラクターまたは演算子を呼び出さずに、あるオブジェクトを別のオブジェクトとして扱う方法はありますか?

4

2 に答える 2

2

ブルースは、ポリモーフィックオブジェクトが値によって渡される状況であるオブジェクトスライスを説明しようとしています。

これがあなたがそれをすることができる方法です:

#include <iostream>
using namespace std;
struct hello {
    virtual void say() { cout << "hello" << endl; }
};
struct world : public hello {
    virtual void say() { cout << "world" << endl; }
};
void force(hello h) {
    h.say();
}
int main() {
    world w;
    w.say();
    force(w);
    return 0;
}

このコードは出力します(ideoneへのリンク

world
hello

タイプのオブジェクトがworld「言う」ことを期待していても、worldではありませんhello。C ++コンパイラは、値によってw渡されることに気付くのが賢明でhelloあるため、派生クラスのメソッドの呼び出しを回避するようにvtableを調整します。


参照による受け渡しを理解しているかどうかをテストするためのボーナス演習:印刷されるようにコードを変更できますworld worldか?1文字挿入できます。

于 2012-10-18T15:06:22.583 に答える
0

適切な演算子なしではオブジェクトをある型から別の型に変換することはできませんが、ポインタを使用して static_cast<> または dynamic_cast<> または reinterpret_cast<> を使用してキャストできます

于 2012-10-18T14:59:35.493 に答える