首页 > 解决方案 > 循环向下转换的 C++ dynamic_cast 不能按预期工作

问题描述

我正在做一个程序来学习模板类和dynamic_cast用途。它使用模板类 ( A) 来制作B类指针列表。在循环中,它检查每个指针是否指向一个C对象,然后执行它的Print()方法。

下面的代码应该输出"C CALL"两次,但它只输出"Start!". 我错过了什么?

#include <vector>

template<typename widget_type>
class A
{
public:
    std::vector<widget_type*> value;

    virtual ~A() {}

    void Add(void* val)
    {
        widget_type* target = (widget_type*)val;
        value.push_back(target);
    }
};

class B
{
public:
    virtual ~B() {}
};

class C : B
{
public:
    void Print()
    {
        std::cout << "C CALL\n";
    }
};

class D : B
{

};

int main()
{
    std::cout << "Start!\n";
    A<B>* index = new A<B>;
    C* c1 = new C;
    D* d1 = new D;
    C* c2 = new C;
    index->Add(c1);
    index->Add(d1);
    index->Add(c2);
    for (unsigned int i = 0; i < 3; i++)
    {
        B* val = index->value[i];
        C* target = dynamic_cast<C*>(val);
        if (target)
        {
            target->Print();
        }
    }
}

标签: c++

解决方案


推荐阅读