C ++中的根基类

时间:2010-03-08 06:53:45

标签: c++ inheritance

.NET中的每个对象都从公共根“Object”继承(直接或间接)。在C ++中是否有这样一个共同的对象根?如何将任何对象传递给函数?

public void DoSomeStuff(object o) { ... }

编辑:澄清,目的:在该函数中,我想调用指向成员函数的指针。为此,我需要对象实例和指向所需函数的指针。为了简化可读性,我想制作一个包含所需信息的包装器。我不确定这是不是最好的方法,但这是背景的想法。

7 个答案:

答案 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::functionboost::bindboost::lambda一起使用。

答案 6 :(得分:0)

如果存在用c ++实现的根对象,则至少要依赖最小的c ++运行时。有时候这是不可取的。