编译后的代码是原生的,但您需要一个额外的库(运行时)来完成所有对象和消息处理(查找、调用等)。不涉及虚拟机。所以它更像是 QT 而不是 Java 运行时。
[更新]
由于 C++ 消息绑定行为对于更动态的 OO 语言(例如:Objective-C 或 Smalltalk)的程序员来说并不明显 - 像我一样 - 我编写了一个小型 C++ 测试应用程序,它演示了virtual
关键字对方法选择的影响称呼。
#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
实际上是 a Test2
which is cast to Test1
。实际输出为
T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2
因为 C++(默认情况下,即没有)根据它在编译时知道的类型(由于virtual
强制转换)静态地将调用绑定到。test1
Test1