繁体   English   中英

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

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

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

在C ++中,如果不知道对象的类型,就不能在对象上调用方法。 它不是动态的。 在Objective C中,您可以执行[对象消息]之类的操作,而在Qt中,您可以使用信号和插槽执行此操作。 在C ++ 11中,您也可以这样做

我的问题是:正确吗?

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

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

为了知道一个函数调用是否是虚拟的或没有,并且在V表,其中以定位一个虚拟函数的位置,类的类型必须是已知的。

在Qt中,只能使用QObject做到这一点。 您可以使用Q_INVOKE宏告诉moc该功能应该可以通过metacall系统访问。 然后,您可以使用QMetaObject::invokeMethod进行调用,只知道基类是QObject (请注意,当然,您仍然需要了解QObject类型。)Qt在内部只是创建可以使用的元代码。调用方法的名称(当它们被标记为Q_SLOTQ_INVOKABLE ,或者在slots部分中。)

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

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

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

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

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

并且非常尖锐:在不知道对象类型的情况下调用方法实际上可以看作是不知道方法的作用。 即使使用动态类型的语言,通常也至少对对象的可能类型有所了解。 这样,我将宣称没有一种应用程序可以在不知道对象类型的情况下调用方法。 注意:我并不是说动态类型是没有用的(一点也不,我对Objective C,Ruby,Javascript感到非常满意)-但我并不是说您不知道任何事情有关动态语言中对象类型的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM