[英]runtime polymorphism and dynamic_cast need clarification
可能会在其他地方回答一些问题,但找不到正确的短语来提问
所以听到它。
我有基础 class 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
function 按预期工作; 后来 bPtr 指向C
并调用print
function 按预期工作;
听到是代码,没有问题听到。
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
语句才能确定基础和孩子之间是否存在 inheritance 或基础和孩子之间是否存在安全投射?
if ( B* b = dynamic_cast<B*>( bPtr ))
{
b->print(); // still calls C::print() anyway;
}
此行为与 dynamic_cast 无关。
虚拟调用的行为将始终取决于值的实际运行时类型。 In your second example, the only thing actually constructed is a C
, so all calls will resolve to C, whether you call it an A: A * a = bPtr
or a B: B * b = bPtr
, it will resolve to C: :print() 因为语句new C
将实际值构造为 C。
Dynamic_cast 只是将给定类型的值转换为特定类型,如果它是该类型的(子类型),否则返回nullptr
。 因此,将B *
动态转换为C *
将失败并返回nullptr
,但在您的情况下,您将C *
转换为其基本类型之一,这将始终成功并且永远不会更改值本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.