2

我不太明白我的一个朋友说的:

在 C++ 中,您不能在不知道对象类型的情况下调用对象的方法。它不是动态的。在 Objective C 中,您可以通过执行类似 [object message] 的操作,在 Qt 中,您可以通过使用信号和插槽来实现。在 C++11 中你也可以这样做

我的问题是:它正确吗?

如果可以,请用简单的英语解释一下,如果我不知道对象的类型,为什么我不能在 C++(不是 C++11)中调用对象的方法。

4

2 回答 2

5

是的,它是正确的(大部分情况下。)C++ 中的对象方法或多或少像普通函数调用一样实现(除了虚函数调用,它类似于函数指针调用。)C++11 并没有让这变得更容易,尽管你可以获取函数指针并将它们存储在 中std::function,然后将其传递给知道可以使用它的类型的东西。这可能是您朋友所指的,并且类似于 Qt 信号/插槽。

为了知道函数调用是否为虚函数,以及虚函数在 vtable 中的位置,必须知道类的类型

在 Qt 中,您只能使用QObject. 您可以使用Q_INVOKE宏来告诉moc该函数应该可以通过元调用系统访问。然后,您可以使用QMetaObject::invokeMethod它来调用它,只知道基类是QObject(请注意,您当然仍然需要知道QObject类型。)Qt 在内部只是创建可用于通过名称调用方法的元代码(当它们标有Q_SLOTor Q_INVOKABLE, or 在一个slots部分中。)

于 2012-11-08T10:09:40.960 回答
0

真相介于两者之间。严格来说,我会说这种说法是错误的。

基本上,C++ 是强类型的,因此变量具有用于整个程序执行的定义类型。在动态语言中,变量的类型可能会在程序执行期间发生变化。

但是,使用虚函数和指针,您可以在 C++ 中调用对象的方法,而无需知道其确切类型。在这种情况下,您将拥有一种基础语言和几个派生类。当使用指向基类的指针调用方法时,您还可以将指向派生类的指针存储在变量中,因此您不知道将调用哪个类的确切方法。

在动态语言中,当您调用未为该对象定义的对象上的方法时,有一个委托机制将(尝试)将消息转发给理解该消息的对象。这是一种通用的运行时机制,在 C++ 中不存在。

现在 Qt 通常像 C++ 一样是强类型的。动态做事的唯一方法是通过基/派生类和虚拟函数的相同机制。

并且非常尖锐:在不知道对象类型的情况下调用方法实际上可以看作是不知道该方法的作用。即使在动态类型语言中,您通常也至少知道对象的可能类型。这样,我会声称没有应用程序可以在不知道对象类型的情况下调用方法。注意:我并不是说动态类型是无用的(一点也不,我对 Objective C、Ruby、Javascript... 很满意)——但我并不是说你什么都不知道关于动态语言中对象的类型。

于 2012-11-08T10:27:55.523 回答