我有一个"接口",名为Base
,定义如下:
struct Base {
int number(){
return 17;
};
};
现在,Derived
类实现了方法number
。
struct Derived: Base {
int number() {
return 42;
}
};
最后,其他一些对象将使用从Base
派生的任何类。
struct Other {
Base b;
Other(Base b): b(b) {
cout << b.number() << endl;
}
};
问题在于,在使用Other
类构造Derived
时,从基类调用方法number
。以下打印&#39; 17&#39;而不是&#39; 42&#39;。
Derived d;
Other o(d);
如何解决这个问题?
备注。我在Java中学习了OOP; c ++对我来说是新的。
答案 0 :(得分:3)
首先,您应该标记number()
virtual
并在Derived
中覆盖它:
struct Base {
virtual int number(){
return 17;
};
};
但这还没有解决问题。在Other
结构中,成员b
是Base
类型的对象,因为它是一个对象(而不是指针/引用),您传递的任何派生将被切成仅仅Base
{1}}对象。你应该做的是将信息保存在指针或引用中:
struct Other {
Base* b;
Other(Base* b): b(b) {
cout << b->number() << endl;
}
};
和
Derived d;
Other o(&d);
请注意悬挂指针与此设置。
答案 1 :(得分:1)
你需要使你的函数成为虚拟函数,并在你的Other类中传递一个引用或指向Base。