Рассмотрим простую ситуацию:C++ не вызывается в подклассе
A.h
class A {
public:
virtual void a() = 0;
};
B.h
#include <iostream>
class B {
public:
virtual void b() {std::cout << "b()." << std::endl;};
};
C.h
#include "A.h"
#include "B.h"
class C : public B, public A {
public:
void a() {std::cout << "a() in C." << std::endl;};
};
int main() {
B* b = new C();
((A*) b)->a(); // Output: b().
A* a = new C();
a->a(); // Output:: a() in C.
return 0;
}
Другими словами:
- А чисто виртуальный класс ,
- B - класс без суперкласса и одна нечистая виртуальная функция.
- C является подклассом A и B и переопределяет чистую виртуальную функцию A.
Что меня удивляет это первый выход, т.е.
((A*) b)->a(); // Output: b().
Хотя я называю() в коде, Ь() вызывается. Я предполагаю, что это связано с тем, что переменная b является указателем на класс B, который не является подклассом класса A. Но все же тип среды выполнения является указателем на экземпляр C.
Что такое точное правило C++, чтобы объяснить это, с точки зрения Java, странное поведение?
Проще говоря: ** B не являются A-х ** Они совершенно не связаны друг с другом, но ваш (нехорошо использовать!) Стилирование в стиле C все равно. 'dynamic_cast' будет правильно перемещать вашу иерархию. Когда вы применяете несвязанные типы указателей, вы получаете неопределенное поведение. Это означает, что все может случиться, из-за этого, похоже, работает, чтобы выдуть ваш компьютер. – GManNickG
Не забывайте носовых демонов. –