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

Base class method being called instead of derived, even when passed by reference

本文关键字:引用 调用 类方法 基类 派生      更新时间:2023-10-16

我有三个类:ABAnotherClass。其中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

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

B b();
AnotherClass myObj(b);

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

我打电话给

myObj.anotherMethod();

我希望它执行anotherMethod(),当它执行时,我希望它调用属于B的REDEFINEDmethod(),但它调用A中定义的默认method()

我想我的问题是因为我把AnotherClass的自变量指定为class A的对象。但是,我不想将此参数更改为class B的对象,因为我还有类CDE,它们也直接从A继承。所以我想使用基类作为参数类型,这样我就不局限于只能传入b对象。但是,我在这个网站上读到了一些旧的帖子,大多数提出的解决方案都是通过引用传递派生对象(b),我正在这样做。

有人能解释为什么会发生这种情况吗?

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

解决方案是使成员变量成为参数的指针或引用(而不是副本)。(请注意,在任何一种情况下,您都需要确保传入的对象的寿命至少与AnotherClass对象一样长。

您正在将构造函数切片到AnotherClass。请注意,您有一个类型为A的值作为成员。所以编译器正在做正确的事情。您在调用a.method()时没有B

只有当它是指针A* a时,它才会工作查找多态性。http://www.cplusplus.com/doc/tutorial/polymorphism/

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