【问题标题】:What is the equivalent of a C++ pure-virtual function in Objective-C?Objective-C 中的 C++ 纯虚函数等价物是什么?
【发布时间】:2011-05-21 10:54:21
【问题描述】:

简单的答案是协议。

另外一点,据说ObjectC中的所有方法都是虚的,所以在ObjC中就不用说虚了。

我很难理解这个概念。

有没有 cmets 可以更清楚地解决这个问题?

感谢您的评论。

【问题讨论】:

标签: c++ objective-c virtual protocols


【解决方案1】:

简单的答案是协议。

简单但错误。协议是一种接口规范。它是一个对象必须响应的消息集合(暂时忽略@optional 关键字)。

“虚拟函数”一词在 Objective-C 中没有直接对应的词。在 Objective-C 中,您不会在对象上调用函数,而是向它们发送消息。然后对象本身决定如何响应消息,通常通过在其类对象中查找消息,找到关联的方法并调用它。请注意,这一切都发生在运行时,而不是编译时。

消息(或“选择器”以赋予它们技术术语)和方法之间的映射完全由@implementation 构建。 @interface 中的方法声明仅用于为编译器提供所需的信息,以警告您您可能忘记了方法实现。这只是一个警告,因为直到运行时您才知道对象是否真的响应消息。例如,其他人可以向现有类添加一个类别,为缺少的方法提供实现,或者一个类可以覆盖 forwardingTargetForSelector: 以转发它在其他地方不响应的消息。

【讨论】:

  • +1 足够接近。尽管您可以将 C++ 对象上的方法视为向该对象发送消息,但它只是消息的绑定是在编译时而不是运行时完成的。
  • @Martin York:感谢您的投票。是的,您可以将调用 C++ 对象上的函数视为发送消息,但这不是真的,这样做也没有多大帮助,而在 Objective-C 中确实如此,这样做很有帮助。跨度>
  • 我认为 OO 的创始人在那里会不同意你的观点。这正是方法的概念(给对象的消息)。 C++ 和 Obj-C 之间的重要区别只是调用绑定到实际方法。 C++ 在编译时完成 Obj-C 在运行时完成(这是唯一的区别)。可以在此处找到有关 OO-P 的相关参考资料的一个很好的总结。 en.wikipedia.org/wiki/Object-oriented_programming
  • 没有。严重地。这可能是唯一的区别,但这是根本的区别。在 Objective-C 中,你确实发送了一条消息。选择器只是obj_msg_send 的参数之一,对象确实决定在运行时如何处理它。对于 C++,这不能说。我并不是说 Objective-C 的方式一定更好,但它是根本不同的。
【解决方案2】:

Objective-C 中对象上的方法不是虚函数,它们是实函数。

我不敢苟同,Obj-C 中的方法并不像人们想象的那样真实。它们的行为就像 C++ 中的虚函数一样,除了你不能在 Objective-C 中创建一个“纯虚”函数。

干杯, 拉克西特

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2016-07-26
    • 2014-07-28
    • 2013-12-01
    • 2015-07-30
    • 2011-07-21
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多