.NET中的每个对象都从公共根“Object”继承(直接或间接)。在C ++中是否有这样一个共同的对象根?如何将任何对象传递给函数?
public void DoSomeStuff(object o) { ... }
编辑:澄清,目的:在该函数中,我想调用指向成员函数的指针。为此,我需要对象实例和指向所需函数的指针。为了简化可读性,我想制作一个包含所需信息的包装器。我不确定这是不是最好的方法,但这是背景的想法。
答案 0 :(得分:11)
没有共同的基类;但是使用类似boost :: any或更多通常基于模板的方法比void *更受欢迎。
答案 1 :(得分:5)
没有共同的根类。使用void *将任何对象传递给函数,或者更好地定义一些基类。
答案 2 :(得分:4)
存在模板函数,并且不需要所有类的根父类。
template <class T>
void DoSomeStuff(T const &t) {
// Do the stuff with t...
t.callTheFunction();
}
如果你的所有对象都有一个成员函数callTheFunction(),那么你得到的行为与拥有根基类完全相同,但要求相同(所有类都有一个带有该名称的函数)。
此外,您还可以为某些不属于您的类专门化模板函数DoSomeStuff()
,并且无法继承您的虚拟成员函数。
答案 3 :(得分:2)
为此我需要对象实例和指向所需函数的指针。
听起来很像“代表”。首先,您肯定需要为要调用的所有对象定义公共基类。在C ++中,如果对象已经属于某个其他层次结构,则可以使用多重继承。
然后阅读Member Functions and the Fastest Possible C++ Delegates这是一篇关于委托主题的优秀深入文章(它是绑定在一起的对象和成员函数指针)。使用该文章中描述的头文件,您可以创建委托并轻松地像常规函数指针一样调用它们。
答案 4 :(得分:0)
抱歉 - C ++中没有root基础对象。但您可以为所有课程定义自己的课程。
答案 5 :(得分:0)
C ++中没有通用的基类。但是,已经存在允许您将成员函数作为委托调用的库。您可以尝试将boost::function与boost::bind或boost::lambda一起使用。
答案 6 :(得分:0)
如果存在用c ++实现的根对象,则至少要依赖最小的c ++运行时。有时候这是不可取的。