C++ C+中的动态绑定示例+;

C++ C+中的动态绑定示例+;,c++,objective-c,late-binding,dynamic-binding,C++,Objective C,Late Binding,Dynamic Binding,这段代码是Objective-C中动态绑定的经典示例 [1] : float total=tareWeight;//从空容器的重量开始 int i,n=[自身大小];//n=成员人数 对于(i=0;i < P>你最接近C++的是一个具有虚拟函数的超级类。虚拟函数,如果您真的关心后期绑定,尽管在您的示例中不清楚这是否必要。Weight可以是超级类中的一个可公开访问的数据成员 C++中动态绑定的形式严格按照类层次结构进行。这允许编译器执行一定级别的检查,而不是将其全部留给运行时系统。除非使用不安全

这段代码是Objective-C中动态绑定的经典示例 [1] :

float total=tareWeight;//从空容器的重量开始
int i,n=[自身大小];//n=成员人数
对于(i=0;i
因此,作为一名在这门语言方面有一定经验的程序员,我首先要做的是 C++中的步骤,我想知道:C++如何实现这一点 它还支持某种后期绑定吗

但是,在本例中,我们假设每个成员都可以属于任何类 当然,实施
weight
方法是必须的。这些天 同样,也可以使用like协议来强制实现 兼容(然后将
成员
声明为
id
),但在 所有这些都是为了能够工作


在C++中,将创建一个具有所谓虚拟函数的超级类 唯一的选择

编辑 为了澄清,上面的代码可以看作是一个容器类方法 返回其组件的总重量。你事先不知道 容器上的内容可以是任何对象。你只知道 这些对象响应消息
weight


[1] 面向对象编程,一种进化的方法,第2版
版本1991,Brad J. Cox,Andrew J. Novobilski -第4章第65页< /P> < P>你最接近C++的是一个具有虚拟函数的超级类。虚拟函数,如果您真的关心后期绑定,尽管在您的示例中不清楚这是否必要。Weight可以是超级类中的一个可公开访问的数据成员

<> C++中动态绑定的形式严格按照类层次结构进行。这允许编译器执行一定级别的检查,而不是将其全部留给运行时系统。除非使用不安全的强制转换


注意,C++中确实有多个继承,所以您希望使用的类只能继承这个超类,但也可以继承任何完全无关的任何东西。p> 您的成员变量需要是指向可称重的

基类的指针。这样的指针可以引用任何派生实例

由于指针会带来内存泄漏风险,所以将其作为智能指针是明智的。C++11具有
唯一性\u 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;
  }
  ...
};

使用C++11移动语义可以提高效率。

“使用所谓的虚拟函数创建一个超类是唯一的选择吗?”几乎是的。你有什么问题?虚拟函数的“所谓”是什么?它们是C++中动态绑定的定义——在运行时使用的函数被解析。@ LealTurnOut-Office有一个细微的区别:Objy-C版本使用隐式接口——它与任何一个响应于<代码>权重< /Co> >的类一起工作,具有整数返回值,而规范C++实现需要类通过子类(可能是抽象的)子类来重写显式接口,并重写它的<代码>虚拟int权重()/Cuth>成员函数。后者要求修改类,除非它已经实现了接口。但是如何声明
成员
变量呢?我的意思是,我如何将它声明为一个类,并将其初始化/用作另一个类?对不起,我对C++的知识了解很少。我不知道你到底在问什么,因为我根本不在Objto-C中工作,但是我认为你需要做的是<代码>成员<代码>是一个指向基类(超级类)的指针;当您在此指针上调用虚拟方法时,会找到相应的方法。这必须通过指针来实现,如果您使用对象,您将遇到“对象切片”。我还想指出,您可以通过“访问者模式”来寻找替代方案,以实现元素类本身的所有功能。可公开访问的数据成员?听起来不是一个好主意,但它可能是一个访问数据成员的公共非虚拟函数。这在一定程度上取决于品味:有些人希望所有数据成员都是私有的,并且需要访问器。有些人认为这条规则有例外。谢谢@DRVic。我稍微修改了一下这个问题。关于多重继承的一点很好,它在这些情况下很有用。谢谢,这澄清了很多问题,我也看到了很多需要研究的地方——有些语法对我来说仍然很难。使用Objective-C中的快速枚举也可以简化循环,但我只想保留书中的原始示例(可以追溯到语言中的这些循环工具之前)。在我为《语言战争》辩护时:-)Brad Cox甚至在他的书中说OOP和传统编程之间唯一的实质性区别是消息选择机制。这一点虽然在C++中存在,但是它被遮蔽得太多,带来其他的麻烦。
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;
  }
  ...
};
template<class WeighableDerivedObject>
heavyContainer::insert(const WeighableDerivedObject& obj){
  members.push_back(new WeighableDerivedObject(obj));
}