决定对基类的变量指针进行函数调用
Decide function call on variable-pointer to base class
我对以下代码有问题。我有一个基类和一个派生类,我无法修改。我有一个向量,在其中存储了一些指向基类的指针。
现在,当我迭代向量时,它应该根据变量的类型调用正确的 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<>
如果现有的库不适合你的面向对象设计,那么编写一个面向对象的包装器可能会起作用。
相关文章:
- 使用共享指针的函数调用,其对象应为 const
- 返回指向对象的指针的函数调用是否为 prvalue?
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 在结构外部调用指向函数的指针
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 指针在函数调用后更改其地址
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 对std::函数对象的调用不匹配,该对象是指向成员函数的指针
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 正确的方法是什么?调用指针到指针到指针内部的函数?
- 参数的混合值,当我调用指针成员函数时
- 使用函数指针时,ESP 未在函数调用中正确保存
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 创建指针时是否没有构造函数调用
- 调用指向成员函数的指针时出错
- 这些函数调用的返回指针的区别是什么?
- 如何通过指向返回另一个函数的函数的指针调用具有默认参数的函数
- 为什么我不能在插入的函数调用中直接使用返回的指针作为参数