动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法

Dynamic C++ vs other languages - can't call a method on an object without knowing the type

本文关键字:情况下 对象 方法 调用 类型 不知道 语言 其他 C++ 比较 动态      更新时间:2023-10-16

我不太了解我的朋友说什么:

在C 中,您不能在不知道类型的情况下调用对象上的方法 对象。这不是动态的。在目标C中,您可以做到 诸如[对象消息]之类的东西,在QT中,您可以使用信号来执行此操作 和老虎机。在C 11中,您也可以做

我的问题是:正确吗?

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

是的,C 中的对象方法是正确的(主要是。11并不能使它变得更容易,尽管您可以采用功能指针并将其存储在std::function中,然后将其传递给不知道可以使用它的类型的东西。这可能是您的朋友所指的,并且类似于QT信号/插槽。

为了知道函数调用是否虚拟呼叫以及VTable中的位置位置在哪里找到虚拟函数,类型的类型已知

在QT中,您只能使用QObject执行此操作。您可以使用Q_INVOKE宏告诉moc应该可以通过Metacall系统访问该功能。然后,您可以使用QMetaObject::invokeMethod来调用它,只知道基类是QObject(请注意,您仍然需要知道QObject类型。用他们的名字(用Q_SLOTQ_INVOKABLEslots部分标记时。)

事实介于两者之间。严格来说,我要说的是索赔是错误的。

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

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

在动态语言中,当您调用未针对对象定义的对象上的方法时,会有一种授权机制(尝试)将消息转发到理解消息的对象。这是一种通用的运行时机制,在C 中不存在。

现在,QT通常像C 一样强烈地键入。动态做事的唯一方法是通过基本/派生的分类和VRITUAL函数的相同机制。

并且非常尖锐:在不知道对象的类型的情况下调用方法实际上不知道该方法的作用。即使在动态键入的语言中,通常您至少有一个可能的对象类型的想法。这样,我会声称没有应用在不知道对象类型的情况下调用方法是有用的。注意:我并不是说动态打字是没有用的(一点都不是,我对目标C,Ruby,JavaScript ...) - 但我是说您什么都不知道关于对象的类型动态语言。

相关文章: