有没有更好的方法来切换没有虚函数的功能?

时间:2016-04-28 14:13:48

标签: c++

我正在学习C ++。我有一个基类Base及其派生类Derived。他们push_back进入std::vector<Base*> vec。假设vec[0] == &Basevec[1] == &Derived,我可以在没有虚函数的情况下切换vec[0]vec[1]的函数。代码在这个问题的最后。没有虚函数有更好的方法吗?我想要纯数据类,我想添加非成员函数来修改它们,以避免修改数据类的代码。非常感谢你。

class TypeInterface {
public:
    virtual int type(void) = 0;
    virtual ~TypeInterface() {}
};

class Base : public TypeInterface {
public:

    static constexpr int type_ = 1;
    virtual int type(void) {
        return type_;
    }

    virtual ~Base() {}
};

class Derived : public Base {
public:

    static constexpr int type_ = 10;
    virtual int type(void) {
        return type_;
    }

    virtual ~Derived() {};
};

void Function(Base* ptr) {
    std::cout << "function for Base" << std::endl;
}

void Function(Derived* ptr) {
    std::cout << "function for Derived" << std::endl;
}

void SwitchFunction(int type, void* ptr) {
    switch (type) {
    case 1: {
        Base* original_type_ptr = static_cast<Base*>(ptr);
        Function(original_type_ptr);
        break;
    }
    case 10: {
        Derived* original_type_ptr = static_cast<Derived*>(ptr);
        Function(original_type_ptr);
        break;
    }
    default:
        std::cout << "invalid type(=" << type << ")" << std::endl;
    }
}

void test_function_selecter(void) {

    Base b;
    Derived d;

    std::vector<Base*> vec;

    vec.push_back(&b);
    vec.push_back(&d);

    for (auto e: vec) {
        SwitchFunction(e->type(), e);
    }

}

1 个答案:

答案 0 :(得分:1)

您不需要键入_&#39;或&#39; int type(void)&#39;而是使用&#39; typeid&#39;

void SwitchFunction(Base* ptr)
{
    auto&& type = typeid(*ptr);
    if (type == typeid(Base))
        Function(dynamic_cast<Base*>(ptr));
    else if (type == typeid(Derived))
        Function(dynamic_cast<Derived*>(ptr));
    else std::cout << "invalid type(=" << type.name() << ")" << std::endl;
}

不幸的是,这可能无法正确回答您的问题,因为它需要&#39; Base&#39;要有一个虚函数(比如析构函数,当你的类型涉及层次结构时,通常建议使用虚函数)