【发布时间】:2012-03-29 14:33:44
【问题描述】:
这段代码是Objective-C动态绑定的经典例子 [1]:
float total = tareWeight; // start with weight of empty container
int i, n = [self size]; // n = number of members
for (i = 0; i < n; ++i) { // loop over each member
id member = [self at:i]; // get next member
total += [member weight]; // accumulate weight of contents
}
return total; // return total weight to caller
所以,作为一名在这门语言方面有一定经验的程序员,我第一次做 C++ 中的步骤,我想知道:给定,这将如何在 C++ 中实现 它还支持某种后期绑定?
在这个例子中,我们假设每个成员都可以属于任何类,但是
当然,实现weight 方法是必须的。这些天机制
也可以使用类似的协议来强制执行
兼容(然后将member 声明为id<Matter>),但在
一切都能正常工作。
在 C++ 中,创建一个具有所谓虚函数的超类是 唯一的选择?
编辑
澄清一下,上面的代码可以看成是一个容器类方法
它返回其组件的总重量。你事先不知道
容器上的内容,可以是任何对象。你只知道
这些对象响应消息weight。
[1] 面向对象编程,一种进化方法,第二 1991 年版 - Brad J. Cox、Andrew J. Novobilski - 第 4 章第 65 页
【问题讨论】:
-
“用所谓的虚函数创建一个超类是唯一的选择吗?”差不多,是的。你有什么问题?
-
虚函数的“所谓”是什么?它们是 c++ 中动态绑定的定义——使用的函数在运行时解析。
-
@leftaroundabout 有一个细微的区别:Objective-C 版本使用 implicit 接口 - 它适用于任何响应具有整数返回值的
weight方法的类,而规范的 C++ 实现要求类通过子类化(可能是抽象的)基类并覆盖其virtual int weight()成员函数来实现 explicit 接口。后者要求修改类,除非它已经碰巧实现了接口。 -
好的,实现将使用虚函数。但是声明
member变量呢?我的意思是,我怎样才能将它声明为一个类并作为另一个类初始化/使用?抱歉,我对 C++ 知之甚少。 -
@sidyll 我不清楚你到底在问什么,因为我根本不在 Objective-c 中工作,但我认为你需要做的是让
member成为指向基类的指针(超类);当您在此指针上调用虚方法时,会找到适当的方法。这必须用指针来实现,如果你使用对象来代替,你会遇到“对象切片”。我还想指出,您可以研究“访问者模式”来替代在元素类本身中实现所有功能。
标签: c++ objective-c late-binding dynamic-binding