c ++使基类在子类中使用重写的方法

时间:2012-05-15 15:59:35

标签: c++ inheritance polymorphism

我正在尝试覆盖基类中另一个方法使用的基类的方法;但是,当派生类调用基类的using方法时,派生的used-method永远不会被执行,而是调用基类的used-method。这是一个例子:

#include <iostream>
using namespace std;
class Base {
public:
    Base() {}
    virtual ~Base() {}
    void printLeft() { cout << this->getLeft(); }
    int getLeft() { return 0; }
};

class Derived: public Base {
public:
    Derived() {}
    virtual ~Derived() {}
    int getLeft() { return 1; }
};
int main(int argc, char *argv[]) {
    Derived d = Derived();
    d.printLeft();
}

运行main()打印0,表示使用Base的{​​{1}}方法,而不是派生对象的方法。

如何更改此代码,以便在从Derived 实例调用时将getLeft()称为

2 个答案:

答案 0 :(得分:6)

您只需要getLeft虚拟:

class Base {
public:
    Base() {}
    virtual ~Base() {}
    void printLeft() { cout << this->getLeft(); }
    virtual int getLeft() { return 0; }
};

默认情况下,在C ++中,成员函数不是虚拟的。也就是说,你不能在子类中覆盖它们。

答案 1 :(得分:1)

对于非虚函数,对象的静态类型用于确定调用哪个类的方法。

在您的情况下,您从getLeft()致电Base::printLeft()this的类型为Base*,因此调用的函数将为Base::getLeft()

解决这个问题的方法是使用virtual关键字。在这种情况下,虚拟功能表将用于确定要调用的getLeft()版本,在本例中为Derived.

您可以通过将virtual添加到printLeftBaseDerived的声明来触发此行为。