gpt4 book ai didi

c++ - 决定对基类变量指针的函数调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:52 24 4
gpt4 key购买 nike

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

现在,当我遍历 vector 时,它应该根据变量的类型调用正确的 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 << "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());

关于c++ - 决定对基类变量指针的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com