基类方法被调用而不是派生的,即使通过引用传递也是如此
Base class method being called instead of derived, even when passed by reference
我有三个类: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
因此,如果我用B
的对象构造AnotherClass
的对象:
B b();
AnotherClass myObj(b);
请记住,由于B
继承自A
,并且AnotherClass
接受A
的对象,因此我能够成功地传入B
对象作为参数。
我打电话给
myObj.anotherMethod();
我希望它执行anotherMethod()
,当它执行时,我希望它调用属于B
的REDEFINEDmethod()
,但它调用A
中定义的默认method()
我想我的问题是因为我把AnotherClass
的自变量指定为class A
的对象。但是,我不想将此参数更改为class B
的对象,因为我还有类C
、D
和E
,它们也直接从A
继承。所以我想使用基类作为参数类型,这样我就不局限于只能传入b
对象。但是,我在这个网站上读到了一些旧的帖子,大多数提出的解决方案都是通过引用传递派生对象(b
),我正在这样做。
有人能解释为什么会发生这种情况吗?
构造函数的参数很好。它是通过引用传递给A
子对象的B
类型的对象。问题是只将A
子对象(而不是派生对象)复制到成员变量a
中。然后,当您调用a.method()
时,那里只有一个基对象,因此调用了基函数。
解决方案是使成员变量成为参数的指针或引用(而不是副本)。(请注意,在任何一种情况下,您都需要确保传入的对象的寿命至少与AnotherClass
对象一样长。
您正在将构造函数切片到AnotherClass
。请注意,您有一个类型为A
的值作为成员。所以编译器正在做正确的事情。您在调用a.method()
时没有B
。
只有当它是指针A* a
时,它才会工作查找多态性。http://www.cplusplus.com/doc/tutorial/polymorphism/
如果你想知道更多,请阅读文章
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 推理类型如何工作"auto"和按引用调用?
- C++ 通过引用调用函数
- 按引用调用与按指针参数调用的差异 前递增和后递增
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过引用调用模板专用化
- 为什么通过带有文字编号的引用调用会出现"无匹配函数"错误?
- 按引用调用还是按值调用?
- 从 JS (V8) 中C++对象的引用调用函数
- 为什么要抛出引用调用复制构造函数的异常?
- 向量 - 通过引用 c++ 调用
- 为什么可以从常量引用调用析构函数
- 使用全局引用调用函数时访问冲突
- 引用调用在 c++ 中如何工作?
- 它不是编译.我正在调用一个通过引用调用的函数,但有一个错误,无法将双*转换为双倍
- C++函数调用 lambda obj,按值调用比按引用调用快
- 如何在 C++14 中编写用于调用 Fortran 函数的通用包装器(按引用调用 --按值调用>)
- 通过引用调用类对象的 2D 数组
- 构造函数参数中的引用调用引用的默认构造函数
- 如何在 main 中使用包含对节点的引用调用函数