#include <QtCore/QCoreApplication>#include <iostream>#include <typeinfo>class B{ public: virtual void f1(){};};class C: public B{ public: void f2(){ std::cout << "f2 is true"; };};class D: public B{ public: void f3(){ std::cout << "f3 is true"; };};void demo(D* p){ C* c = dynamic_cast<C*>(p); // Кастомщик понимает, что ему дали объект типа C? if(c) {c->f2(); std::cout << "it executed" << std::endl;} else {std::cout << std::endl << " it isn't executed ";} // Не выполнено }int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); B* b = new C; // Объявляем переменную типа C. demo((D*)b); // передаем ее в функцию, принимающую указатель на тип D //D* c = static_cast<D*>(b); //std::cout<< typeid(*c).name() << std::endl; //demo((D*)c); return a.exec();}
if(c) {c->f2(); std::cout << "it executed" << std::endl;} else {std::cout << std::endl << " it isn't executed ";} // Не выполнено}
C++ (Qt) if (c) { c->f2(); std::cout << "it executed" << std::endl; } else std::cout << std::endl << " it isn't executed "; // Не выполнено
CONFIG += rtti
(D*)b
C++ (Qt)class B{public: virtual void f1(){ // qDebug() << "B"; }};class C {public: virtual void f2(){ // qDebug() << "C"; }};class D: public B, public C {}; void demo(B* b) { // C* c = dynamic_cast<C*>(b); if(c) c->f2();} int main(int argc, char *argv[]) { // QCoreApplication a(argc, argv); D* d = new D; demo(d); delete d; return a.exec();}
C++ (Qt) D* d = new D;}
C++ (Qt)B * b = dynamic_cast <B *> (p);C * c = dynamic_cast <C *> (b);
C++ (Qt)#include <iostream>#include <typeinfo> class B { public: virtual void f1(){};}; class C: public B{ public: void f2(){ std::cout << "f2 is true"; };}; class D: public B { public: void f3(){ std::cout << "f3 is true"; };}; void demo( D * p ){// C * c = dynamic_cast <C *> (p); B * b = dynamic_cast <B *> (p); C * c = dynamic_cast <C *> (b); if (c) { c->f2(); std::cout << "it executed" << std::endl; } else std::cout << std::endl << " it isn't executed "; // Не выполнено} int main(int argc, char *argv[]){ B * b = new C; demo((D*) b); return 0;}