即使通过引用传递,也会调用基类方法而不是派生方法

时间:2016-06-09 17:43:41

标签: c++ inheritance polymorphism

我有3个课程:ABAnotherClassB来自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的对象,因为我还有类CDE,它们也直接从{{{I}继承。 1}}。所以我想使用基类作为参数类型,所以我不仅限于能够传入A对象。但是,我在这个网站上阅读了一些较旧的帖子,大多数建议的解决方案是通过引用传递派生对象(b),我正在这样做。

有人可以解释为什么会这样吗?

3 个答案:

答案 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/

如果你不知道更多,请阅读文章