我试图覆盖基类中另一个方法使用的基类方法;但是,当派生类调用基类的use-method时,将永远不会执行派生的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,表明使用了BasegetLeft()方法,而不是派生对象的方法。

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

最佳答案

您只需要将getLeft虚拟:

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

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

09-06 17:36