这段代码是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] 面向对象编程,一种进化方法, 2nd 版本,1991 - Brad J. Cox,Andrew J. Novobilski - 第4章第65页
答案 0 :(得分:1)
与C ++最接近的是具有虚函数的超类。虚拟函数如果你真的关心后期绑定,虽然在你的例子中不清楚是否有必要。权重可以只是超类中可公开访问的数据成员。
C ++中的动态绑定形式严格地在类层次结构中上下。这允许编译器执行某种级别的检查,而不是将其全部留给运行时系统。除非你使用不安全的演员阵容。
请注意,您确实在C ++中获得了多重继承,因此您希望能够使用的类只能从此超类继承,但也可以继承其他完全不相关的类。
答案 1 :(得分:1)
您的成员变量需要是指向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移动语义可以提高效率。