我有3个课程:A
,B
和AnotherClass
。 B
来自A
的地方:
class A {
public:
A(){}
virtual void method() {//default action}
};
然后我有一个派生类,B:
class B : public A {
public:
B(){}
void method() {//redefine action}
};
AnotherClass
:
class AnotherClass {
public:
AnotherClass(A& a);
A a;
anotherMethod(){ a.method()}
};
AnotherClass :: AnotherClass(A& a) : a(a) //initialization
所以,如果我构造一个AnotherClass
的对象,其对象为B
:
B b();
AnotherClass myObj(b);
请注意,由于B
继承自A
,而AnotherClass
接受A
的对象,因此我能够成功传入B
对象作为参数。
我打电话给:
myObj.anotherMethod();
我希望这会执行anotherMethod()
,当它发生时,我希望它会调用属于method()
的REDEFINED B
,而是调用默认的method()
在A
我在想我的问题是因为我将AnotherClass
的参数指定为class A
的对象。但是,我不想将此参数更改为class B
的对象,因为我还有类C
,D
和E
,它们也直接从{{{I}继承。 1}}。所以我想使用基类作为参数类型,所以我不仅限于能够传入A
对象。但是,我在这个网站上阅读了一些较旧的帖子,大多数建议的解决方案是通过引用传递派生对象(b
),我正在这样做。
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
构造函数的参数很好。它是B
类型的对象,它通过引用传递给A
子对象。问题是您只将A
子对象 (而不是派生对象)复制到成员变量a
中。然后当你调用a.method()
时,那里只有一个基础对象,所以调用基函数。
解决方案是使成员变量成为参数的指针或引用(而不是副本)。 (请注意,在任何一种情况下,您都需要确保传入的对象至少与AnotherClass
对象一样长。
答案 1 :(得分:2)
您正在将构造函数切换为AnotherClass
。请注意,您具有类型为A
的值作为成员。所以编译器正在做正确的事情。在您拨打B
时,您没有a.method()
。
答案 2 :(得分:1)
只有当它是指针A* a
时才会起作用
查看多态性。
http://www.cplusplus.com/doc/tutorial/polymorphism/
如果你不知道更多,请阅读文章