繁体   English   中英

运行时多态性和 dynamic_cast 需要澄清

[英]runtime polymorphism and dynamic_cast need clarification

可能会在其他地方回答一些问题,但找不到正确的短语来提问

所以听到它。

我有基础 class A ,有孩子BC (完全用于培训目的)

#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; 后来孩子的BC也声明了。

后来 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM