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

Mik*_*son 3 c++ polymorphism inheritance

我有3类:AB,和AnotherClass。其中B来源于A

class A {
public:
    A(){}
    virtual void method() {//default action}
};
Run Code Online (Sandbox Code Playgroud)

然后我有一个派生类B:

class B : public A {
public:
    B(){}
    void method() {//redefine action}
};
Run Code Online (Sandbox Code Playgroud)

AnotherClass

class AnotherClass {
public:
    AnotherClass(A& a);
    A a;
    anotherMethod(){ a.method()}
};
AnotherClass :: AnotherClass(A& a) : a(a) //initialization
Run Code Online (Sandbox Code Playgroud)

因此,如果我AnotherClass用的对象构造一个对象B

B b();
AnotherClass myObj(b);
Run Code Online (Sandbox Code Playgroud)

请记住,由于B继承自A,并AnotherClass接受的对象A,因此我能够成功传入一个B对象作为参数。

我打电话给:

myObj.anotherMethod();
Run Code Online (Sandbox Code Playgroud)

我希望它能够执行anotherMethod(),并且当它执行时,我希望它调用method()所属的REDEFINED B,但是它将调用在中method()定义的默认值。A

我当时以为我的问题是因为我将参数指定AnotherClass为的对象class A。不过,我不希望这样的说法改变的对象class B,因为我也有课CDE也继承直接A。因此,我想将基类用作参数类型,因此我不仅限于只能传递b对象。但是,我在该站点上阅读了一些较旧的文章,大多数提议的解决方案是b通过引用传递派生的对象(),我正在这样做。

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

Mar*_*ica 5

构造函数的参数很好。它是B通过引用传递给A子对象的类型的对象。问题在于您A子对象(而不是派生对象)复制到成员变量中。然后,当您调用时,那里只有一个基础对象,因此将调用基础函数。aa.method()

解决方案是使成员变量成为参数的指针或引用(而不是副本)。(请注意,无论哪种情况,您都需要确保传入的对象的生存时间至少与该AnotherClass对象一样长。