编译以下代码时:
class Base {
public:
Base(){}
virtual ~Base(){}
virtual bool equals(const Base* rhs) const { return false;}
};
class DerivedA : public Base {
public:
DerivedA() : Base(), val(0) {}
virtual ~DerivedA() {}
virtual bool equals(const DerivedA* rhs) const { return this->val == rhs->val;}
int val;
};
class DerivedB : public Base {
public:
DerivedB() : Base(), val(0) {}
virtual ~DerivedB() {}
virtual bool equals(const DerivedB* rhs) const { return this->val == rhs->val;}
int val;
};
int main() {
const DerivedA a;
const DerivedB b;
std::cout << a.equals(&b);
}
我得到:
../main.cpp:104:26: error: no matching function for call to ‘DerivedA::equals(const DerivedB*) const’
std::cout << a.equals(&b);
^
../main.cpp:104:26: note: candidate is:
../main.cpp:88:15: note: virtual bool DerivedA::equals(const DerivedA*) const
virtual bool equals(const DerivedA* rhs) const { return this->val == rhs->val;}
^
../main.cpp:88:15: note: no known conversion for argument 1 from ‘const DerivedB*’ to ‘const DerivedA*’
但是为什么它不使用基类 virtual bool equals(const Base* rhs) const
?
最佳答案
bool DerivedA::equals(const DerivedA* rhs) const
不是覆盖
bool Base::equals(const Base* rhs) const
但是另一个重载(正如您可能注意到的覆盖
)隐藏了基本方法。
如果您只想“取消隐藏”基本方法,您可以添加
using Base::equals;
进入你的派生类。
但要真正解决您的问题,您必须使用多重调度。
关于c++ - 虚拟公共(public)基类方法在祖先中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549514/