Мог бы ответить где-то еще, но не смог найти правильную фразу, чтобы спросить
, так что слушайте.
У меня базовый класс A
с дочерними B
и C
; (полностью для целей обучения)
#include <iostream>
class A
{
public:
virtual void print () { std::cout<< "A::print()" << std::endl; }
};
class B: public A
{
public:
void print () { std::cout<< "B::print()" << std::endl; }
};
class C : public B
{
public:
void print () { std::cout<< "C::print()" << std::endl; }
};
итак, в моем основном я объявил базовый указатель A*
bptr; позже также объявлены дочерние B
и C
.
позже bPtr указал на B
и вызвал print
функцию, работающую должным образом; позже bPtr указал на C
и вызвал функцию print
, которая работает должным образом;
слышит код, нет проблем слышит.
int main()
{
A* bPtr;
B b;
C c;
bPtr = &b;
bPtr->print(); // prints B::print() - as expected;
bPtr = &c;
bPtr->print(); // prints C::print() - as expected;
}
слышать - это моя дилемма, я могу неправильно понять; теперь то, что я думал все эти дни, dynamic_cast
также делает точно выше; но все по-другому, ИЛИ я делаю что-то не так. безопасный переход между базой и детским?
if ( B* b = dynamic_cast<B*>( bPtr ))
{
b->print(); // still calls C::print() anyway;
}