我有一个派生自父类的类。它调用父类的成员。但是,由于子类的功能要求,需要修改成员的行为。我用这种方式写了代码:
class parentClass
{
public:
void memberA()
{
memberB();
}
void memberB()
{
behaviorParent;
}
};
class childClass:public parentClass
{
public:
void memberB()
{
behaviorChild;
}
};
int main()
{
child naughty;
naughty.memberA();
}
我期待一个behaviorChild成为结果。但是,程序给了我一个behaviorParent而不是behaviorChild。你知道为什么吗?并且,如何修复它而不复制父成员的代码?
答案 0 :(得分:1)
parentClass::memberB
未声明为virtual
。因此,编译器假定memberB
对parentClass::memberA
的调用是指parentClass::memberB
。
告诉编译器,如果存在这样的函数,对memberB
的调用应该引用派生类中定义的memberB
,将parentClass::memberB
声明为
virtual void memberB();
答案 1 :(得分:0)
你在派生类中没有child::A()
。所以这将是基础版本。如果您需要其他内容,则需要在派生类
child:A()
答案 2 :(得分:0)
您正在使用基类中的memberA()
方法。基类中的此方法无法了解您在子级中实现了什么。这就是它仍然从基类调用memberB()
的原因。
如果您不想更改基类代码,则必须覆盖子类中的memberA()
方法。