我不太了解我的一个 friend 说的话:
我的问题是:正确吗?
如果可以的话,请用普通的英语向我解释,如果我不知道该对象的类型,为什么不能在C++(不是C++ 11)对象上调用方法。
最佳答案
是的,它是正确的(大多数情况下是正确的。)C++中的对象方法或多或少地像普通函数调用一样实现(虚拟函数调用除外,虚拟函数调用类似于函数指针调用。)C++ 11并没有使它变得更容易,尽管您可以获取函数指针并将其存储在std::function
中,然后将其传递给不知道可以使用它的类型的对象。那可能就是您的 friend 所指的,并且类似于Qt信号/插槽。
为了知道函数调用是否是虚拟的,以及vtable在虚拟表中的位置,必须知道类的类型。
在Qt中,您只能使用QObject
进行此操作。您可以使用Q_INVOKE
宏告诉moc
该功能应该可以通过metacall系统访问。然后,您可以使用QMetaObject::invokeMethod
来调用它,只知道基类是QObject
(请注意,当然,您仍然需要知道QObject
类型。)Qt在内部只是创建可用于调用方法的元代码。按名称(在标记为Q_SLOT
或Q_INVOKABLE
或slots
部分中时)。
关于c++ - 动态C++与其他语言-在不知道类型的情况下无法在对象上调用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13286639/