コンパイルされたコードはネイティブですが、すべてのオブジェクトとメッセージの処理 (ルックアップ、呼び出しなど) を行う追加のライブラリ (ランタイム) が必要です。関連する仮想マシンはありません。つまり、Java ランタイムというよりも QT に似ています。
[アップデート]
C++ メッセージ バインディングの動作は、より動的な OO 言語 (例: Objective-C や Smalltalk) のプログラマー (私のように) には明らかではないためvirtual
、メソッドの選択に対するキーワードの影響を示す小さな C++ テスト アプリを作成しました。電話。
#include <iostream>
class Test1 {
public:
Test1();
void test1();
void test2();
};
class Test2 : Test1 {
public:
Test2();
void test1();
void test2();
};
Test1::Test1() {}
void Test1::test1() { std::cout << "T1:t1" << std::endl; }
void Test1::test2() { std::cout << "T1:t2" << std::endl; }
Test2::Test2() {}
void Test2::test1() { std::cout << "T2:t1" << std::endl; }
void Test2::test2() { std::cout << "T2:t2" << std::endl; }
int main(int argc, char **argv)
{
Test1 *t11 = new Test1();
Test1 *t12 = (Test1 *)(new Test2());
Test2 *t2 = new Test2();
t11->test1();
t11->test2();
t12->test1();
t12->test2();
t2->test1();
t2->test2();
return 0;
}
Objective-C プログラマは、次の出力を期待します。
T1:t1
T1:t2
T2:t1
T2:t2
T2:t1
T2:t2
なぜなら、t12
実際にTest2
は にキャストされたTest1
です。実際の出力は
T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2
C++(デフォルトでは、つまりなし)は、コンパイル時に知っている型に基づいてvirtual
呼び出しを静的にバインドするためです(キャストによる)。test1
Test1