c++ - C++ 中的动态绑定(bind)示例

标签 c++ objective-c late-binding dynamic-binding

这段代码是Objective-C中动态绑定(bind)的经典例子 [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++ 中实现,给定 它也支持某种后期绑定(bind)?

在这个例子中,我们假设每个成员都可以属于任何类,但是 实现weight方法当然是必须的。这些天机制 也可以使用类似的协议(protocol)来强制实现 兼容(然后将 member 声明为 id<Matter> )但不需要 一切都能够工作。

在 C++ 中,创建一个带有所谓的虚函数的父类(super class)是 唯一的选择?

编辑

澄清一下,上面的代码可以看作是一个容器类的方法 它返回其组件的总重量。你事先不知道 容器上会有什么,它可以是任何物体。你只知道 这些对象响应消息 weight .


[1] 面向对象编程,一种进化方法,第二 版本,1991 - Brad J. Cox、Andrew J. Novobilski - 第 4 章第 65 页

最佳答案

您的成员变量需要是指向 weighable 基类的指针。这样的指针可以引用任何派生实例。

既然指针会带来内存泄漏的风险,那么做成智能指针就比较聪明了。 C++11 有 unique_ptr。所以你的课看起来像

class heavyContainer {
  std::vector<std::unique_ptr<weighable>> members;
 public:
  float total_weight() {
    float result = tareWeight;
    for(auto& member: members)
      result += member->weight();
    return result;
  }
  ...
};

要使用 weighable 的任意派生实例初始化成员,您需要对这些对象进行堆分配。这可能有点棘手,因为没有通用的方法来复制基类指针引用的对象。一种方法是使插入函数成为模板:

template<class WeighableDerivedObject>
heavyContainer::insert(const WeighableDerivedObject& obj){
  members.push_back(new WeighableDerivedObject(obj));
}

这可以通过 C++11 移动语义变得更加高效。

关于c++ - C++ 中的动态绑定(bind)示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927529/

相关文章:

iphone - 如何在 Xcode 的框架中进行调试?

当在派生类中定义重载时,C# 后期绑定(bind)方法重载不起作用

c# - 早期和晚期绑定(bind)

c++ - 当一个线程在另一个线程中捕获异常后运行时,进程中止并发出 SIGABRT

c++ - 类似排序的 STL 函数

c++ - 在 Cocoa/Objective-C 项目中包含 C++ 代码时出现未知类型名称 'class'

objective-c - RTFString 包含 NSASCIIStringEncoding 特殊字符?

vba - VBA 中 msoTextOrientationHorizo​​ntal 的常量值是多少?

c++ - 调色板图像需要有效的调色板

c++ - Qt 为未找到的 Windows 应用程序 .rc 文件设置应用程序图标