Mik*_*son 3 c++ polymorphism inheritance
我有3类:A,B,和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,因为我也有课C,D和E也继承直接A。因此,我想将基类用作参数类型,因此我不仅限于只能传递b对象。但是,我在该站点上阅读了一些较旧的文章,大多数提议的解决方案是b通过引用传递派生的对象(),我正在这样做。
有人可以解释为什么会这样吗?
构造函数的参数很好。它是B通过引用传递给A子对象的类型的对象。问题在于您仅将A子对象(而不是派生对象)复制到成员变量中。然后,当您调用时,那里只有一个基础对象,因此将调用基础函数。aa.method()
解决方案是使成员变量成为参数的指针或引用(而不是副本)。(请注意,无论哪种情况,您都需要确保传入的对象的生存时间至少与该AnotherClass对象一样长。