动态C++与其他语言的比较 - 在不知道类型的情况下无法在对象上调用方法
Dynamic C++ vs other languages - can't call a method on an object without knowing the type
我不太了解我的朋友说什么:
在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_SLOT
或Q_INVOKABLE
或slots
部分标记时。)
事实介于两者之间。严格来说,我要说的是索赔是错误的。
基本上,C 是强烈键入的,因此变量具有整个程序执行的定义类型。在动态语言中,变量的类型在程序执行过程中可能会发生变化。
但是,使用虚拟函数和指针,您可以在C 中的对象上调用方法,而不知道其确切类型。在这种情况下,您将拥有一种基本语言和几个派生的类。当使用指针到基类的指针调用方法时,您还可以在变量中存储一个指向派生类的指针,因此您不确切地知道该方法将被调用。
在动态语言中,当您调用未针对对象定义的对象上的方法时,会有一种授权机制(尝试)将消息转发到理解消息的对象。这是一种通用的运行时机制,在C 中不存在。
现在,QT通常像C 一样强烈地键入。动态做事的唯一方法是通过基本/派生的分类和VRITUAL函数的相同机制。
并且非常尖锐:在不知道对象的类型的情况下调用方法实际上不知道该方法的作用。即使在动态键入的语言中,通常您至少有一个可能的对象类型的想法。这样,我会声称没有应用在不知道对象类型的情况下调用方法是有用的。注意:我并不是说动态打字是没有用的(一点都不是,我对目标C,Ruby,JavaScript ...) - 但我是说您什么都不知道关于对象的类型动态语言。
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 在这种情况下,java对象是否可以调用本机函数
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在不复制临时对象的情况下延长其生存期
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在不销毁对象的情况下返回对象列表
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 在没有默认构造函数的情况下创建的派生对象
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 如何在没有 std::move 的情况下移动临时对象
- 如何在不复制的情况下操作 QByteArray 对象?
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 在没有堆的情况下用两种方法构造对象
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 为什么成员变量会更改,但在这种情况下对象的地址保持不变?