我正在学习C ++。我有一个基类Base
及其派生类Derived
。他们push_back
进入std::vector<Base*> vec
。假设vec[0] == &Base
和vec[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);
}
}
答案 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;要有一个虚函数(比如析构函数,当你的类型涉及层次结构时,通常建议使用虚函数)