Скомпилированный код является нативным, но вам нужна дополнительная библиотека (среда выполнения), которая выполняет всю обработку объектов и сообщений (поиск, вызов и т. Д.).Виртуальная машина не задействована.Так что это больше похоже на QT, чем на среду выполнения Java.
[Update]
Поскольку поведение привязки сообщений C ++ не очевидно для программистов более динамических языков ОО (например: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
на самом деле Test2
, который был приведен к Test1
.Фактический вывод -
T1:t1
T1:t2
T1:t1
T2:t2
T2:t1
T2:t2
, потому что C ++ (по умолчанию, т.е. без virtual
) статически связывает вызов с test1
на основе типа, который он знает во время компиляции, который равен Test1
(из-заактерский состав).