决定对基类的变量指针进行函数调用



我对以下代码有问题。我有一个基类和一个派生类,我无法修改。我有一个向量,在其中存储了一些指向基类的指针。

现在,当我迭代向量时,它应该根据变量的类型调用正确的 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

有人可以帮助我解决这个问题吗?

问候斯特凡

编辑:插入虚拟析构函数

一种解决方案是使用虚函数。您还可以使用 std::unique_ptr 来避免内存泄漏,即:

#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class base{
public:
    base() { }
    virtual ~base() { }
    virtual void function() { std::cout << "basen"; }
};
class a : public base
{
public:
    a() { }
    ~a() { }
    virtual void function() { std::cout << "an"; }
};
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());

函数重载是在编译时完成的,而这里你想要的是两个函数之间的运行时选择。 因此,这意味着使用虚拟方法进行多态性,或者如果这是不可能的,则直接查询运行时类型信息,例如使用dynamic_cast<>

如果现有的库不适合你的面向对象设计,那么编写一个面向对象的包装器可能会起作用。

相关内容

最新更新