我正在尝试覆盖基类中另一个方法使用的基类的方法;但是,当派生类调用基类的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()
称为?
答案 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
添加到printLeft
和Base
中Derived
的声明来触发此行为。