Это загадка, с которой я столкнулся на этой неделе.Отчасти это связано с тем, что я только что вернулся к кодированию на C ++ после некоторого программирования на Java.Учитывая следующий код:
class Base {
};
class A : Base {
public:
virtual void run() { cout << "This is A." << endl; }
};
class B : Base {
public:
virtual void run() { cout << "This is B." << endl; }
};
class C : A, B {
public:
void run() { cout << "This is C." << endl; }
};
int main(int argc, char* argv[])
{
shared_ptr<A> ptrToA = shared_ptr<C>(new C());
cout << "Pointer to A: " << ptrToA.get() << endl;
cout << "Dynamic Cast A ptr to C: " << dynamic_pointer_cast<C>(ptrToA) << endl;
ptrToA->run();
assert(dynamic_pointer_cast<C>(ptrToA));
cout << "Success!" << endl;
}
Почему он выдает следующий вывод?
Pointer to A: 0x1f29c010
Dynamic Cast A ptr to C: 0
Running...
This is C.
tester-cpp: tester.cpp:89: int main(int, char **): Assertion `dynamic_pointer_cast<C>(ptrToA)' failed.
Поскольку выводится "This is C", очевидно, что полиморфизм работает, но онне удается при динамическом приведении shared_ptr из базового класса «A» в «C».Я потратил впустую часы на этот тонкий вопрос на этой неделе!Надеемся, что любые ответы помогут будущим кодировщикам с похожей проблемой сэкономить много времени (ошибка была очень незначительной, особенно после некоторого времени написания кода на Java).
Почему?(Я дам вам подсказку ... этот код был скомпилирован с помощью компилятора Intel C ++ 12.1.0 в Linux. Я попробовал его с другим компилятором, и мой код не компилируется! )