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

Joh*_*ing 2 c++ qt objective-c

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

在C++中,如果不知道对象的类型,则无法在对象上调用方法.这不是动态的.在Objective C中,您可以通过执行类似[object message]的操作,在Qt中,您可以使用信号和插槽来完成.在C++ 11中,您也可以这样做

我的问题是:这是正确的吗?

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

Joh*_*ick 5

是的,它是正确的(主要是.)C++中的对象方法或多或少像普通函数调用一样实现(虚函数调用除外,它类似于函数指针调用.)C++ 11不会使这更容易,尽管你可以获取函数指针并将其存储std::function,然后将其传递给知道可以使用它的类型.这可能是你的朋友所指的,并且类似于Qt信号/插槽.

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

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