首页 > 解决方案 > 如何识别从不同子类覆盖的向量类?

问题描述

我想确定哪些子类初始化向量中的指针。

我准备了一个包含不同类型覆盖类的向量。之后,我将其设置为同一函数中的参数。在函数中,我想确定哪些类初始化了这个参数并为每个类应用不同的过程。

这是代码和当前输出。

#include <memory>
#include <iostream>
#include <vector>

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

    virtual void print() 
    {
        std::cout << "I am parent!" << std::endl;
    }

};


class ChildA : public Parent
{
public:
    ChildA() {};
    ~ChildA() {};

    void print() override
    {
        std::cout << "I am child A!" << std::endl;
    }

};

class ChildB : public Parent
{
public:
    ChildB() {};
    ~ChildB() {};

    void print() override
    {
        std::cout << "I am child B!" << std::endl;
    }
};

void func(std::unique_ptr<Parent>& pa)
{
    pa->print();

    //if (pa is initialized from Parent)
    //{
    //}

    //if (pa is initialized from ChildA)
    //{
    //}

    //if (pa is initialized from ChildB)
    //{ 
    //}

    return;
}

int main(int argc, char** argv)
{
    std::unique_ptr<Parent> pa = std::make_unique<Parent>();
    std::unique_ptr<ChildA> chA = std::make_unique<ChildA>();
    std::unique_ptr<ChildB> chB = std::make_unique<ChildB>();


    std::vector<std::unique_ptr<Parent>> mList;
    mList.push_back(std::move(pa));
    mList.push_back(std::move(chA));
    mList.push_back(std::move(chB));

    for (auto& l : mList)
        func(l);

    return 0;
}

输出

I am parent!
I am child A!
I am child B!

你能告诉我任何想法吗?谢谢你。

标签: c++c++11overriding

解决方案


使用虚函数编写多态代码的目的通常是为了避免进行“这是一个 X”风格的测试。相反,您在基类中创建一个虚函数doSpecialStuff并通过基类指针调用它(就像print在您的代码中一样),然后对每个派生类执行适当的操作。

如果您真的想测试类型,请使用dynamic_cast

if(auto child_ptr=dynamic_cast<ChildA*>(pa.get())){
   child_ptr->child_A_function();
}

推荐阅读