可能在其他地方回答了问题,但找不到正确的短语要问
所以听到了。
我有基类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
也在上面做;但情况有所不同,或者我做错了。
int main()
{
A* bPtr = new C;
bPtr = dynamic_cast<B*>( bPtr );
bPtr->print(); // prints C::print() - expected B::print()
/*
I know above can be correct with explicit call
*/
(dynamic_cast<B*>( bPtr ))->B::print(); // B::print
bPtr = dynamic_cast<C*>( bPtr );
bPtr->print(); // prints C::print()
return 0;
if ( B* b = dynamic_cast<B*>( bPtr ))
{
b->print(); // still calls C::print() anyway;
}
}
所以我的问题是dynamic_cast
很好,并且只有if
语句这样的地方才能确定基础与孩子之间是否存在继承关系,或基础与孩子之间是否存在安全继承?
if ( B* b = dynamic_cast<B*>( bPtr ))
{
b->print(); // still calls C::print() anyway;
}
此行为与dynamic_cast无关。