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

问题描述 投票:0回答:1

可能在其他地方回答了问题,但找不到正确的短语要问

所以听到了。

我有基类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函数按预期工作;稍后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;
}
c++ polymorphism dynamic-cast
1个回答
2
投票

此行为与dynamic_cast无关。

© www.soinside.com 2019 - 2024. All rights reserved.