使用父类成员调用重写成员的派生类的意外行为

时间:2013-11-17 12:06:02

标签: c++ class inheritance override

我有一个派生自父类的类。它调用父类的成员。但是,由于子类的功能要求,需要修改成员的行为。我用这种方式写了代码:

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。你知道为什么吗?并且,如何修复它而不复制父成员的代码?

3 个答案:

答案 0 :(得分:1)

parentClass::memberB未声明为virtual。因此,编译器假定memberBparentClass::memberA的调用是指parentClass::memberB

告诉编译器,如果存在这样的函数,对memberB的调用应该引用派生类中定义的memberB,将parentClass::memberB声明为

virtual void memberB();

答案 1 :(得分:0)

你在派生类中没有child::A()。所以这将是基础版本。如果您需要其他内容,则需要在派生类

中覆盖child:A()

答案 2 :(得分:0)

您正在使用基类中的memberA()方法。基类中的此方法无法了解您在子级中实现了什么。这就是它仍然从基类调用memberB()的原因。

如果您不想更改基类代码,则必须覆盖子类中的memberA()方法。

您可以找到example of overriding in C++ here