我遇到以下代码问题。我有一个基类和派生类,我无法修改。我有一个向量,我存储一些指向基类的指针。
现在,当我遍历向量时,它应该根据变量的类型调用正确的void函数。
#include <iostream>
#include <vector>
using namespace std;
//base and a can't be modified, because they are in a library
class base
{
virtual ~base(){};
};
class a : public base
{
virtual ~a(){};
};
void Funktion(base* variable)
{
cout << "base" << endl;
}
void Funktion(a* variable)
{
cout << "a" << endl;
}
int main()
{
vector<base*> list;
list.push_back(new a());
list.push_back(new base());
for each (base* var in list)
Funktion(var);
}
在此示例中,它应输出:
a
base
但它输出:
base
base
有人可以帮我解决这个问题吗?
关心Stefan
编辑:插入虚拟析构函数
答案 0 :(得分:1)
一种解决方案是使用虚拟功能。您还可以使用std::unique_ptr
来避免内存泄漏,例如:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class base{
public:
base() { }
virtual ~base() { }
virtual void function() { std::cout << "base\n"; }
};
class a : public base
{
public:
a() { }
~a() { }
virtual void function() { std::cout << "a\n"; }
};
int main()
{
vector<std::unique_ptr<base>> list;
list.push_back(std::unique_ptr<base>(new a()));
list.push_back(std::unique_ptr<base>(new base()));
for (const auto& e : list)
{
e->function();
}
}
另一种是为您的派生对象尝试dynamic_cast
。
a* ptr = dynamic_cast<a*>(e.get());
if (ptr)
funktion(ptr);
else
funktion(e.get());
答案 1 :(得分:0)
函数重载是在编译时完成的,而你想要的是两个函数之间的运行时选择。这意味着使用虚方法进行多态,或者如果不可能,则直接查询运行时类型信息,例如使用dynamic_cast&lt;&gt;
如果现有的库变得非常适合面向对象的设计,那么可能需要编写一个面向对象的包装器