C++中使用override重写EQUAL函数报错的原因咨询
问题原因解析
先贴出你的核心代码结构:
template<typename T> class ITF{ public: virtual T& EQUAL(const T& K) = 0; }; class S : public virtual ITF<S> { public: S &EQUAL(const S &K) override; }; class D : public virtual S{ public: D& EQUAL(const D& M) override{ // 此处加override报错 S::EQUAL(M); Ra = M.Ra; return *this; } };
核心问题:override要求函数签名严格匹配
C++里override关键字的作用是强制编译器检查:当前函数是否精确匹配某个基类的虚函数签名(返回值允许协变,但参数类型必须完全一致)。
S类的EQUAL函数签名是S& EQUAL(const S&),它完美匹配了ITF<S>中声明的虚函数virtual S& EQUAL(const S&),所以加override没问题。- 到了
D类,你写的D& EQUAL(const D&)参数是const D&,和基类S的const S&参数类型不匹配——哪怕D是S的子类,参数类型不一样就不算重写,只是同名函数的隐藏。
当你加override时,编译器找不到和D::EQUAL签名完全一致的基类虚函数,因此直接报错,提示你这个函数无法override任何基类虚函数,反而还隐藏了S::EQUAL。
为什么去掉override就可以编译?
去掉override后,D::EQUAL(const D&)只是一个普通成员函数,它会触发C++的同名函数隐藏规则:子类的同名函数会覆盖基类的同名函数。这时候编译器不会检查它是否重写虚函数,所以代码能通过编译,但这不是多态意义上的重写——比如用S*指针指向D对象时,调用EQUAL执行的还是S::EQUAL,而非D::EQUAL。
若想实现真正的多态重写怎么办?
要让D的EQUAL成为多态重写的虚函数,必须让它的签名和基类完全一致:
// D类中修改为如下代码 S& EQUAL(const S& M) override { // 额外检查传入的是否是D类型对象 if (const D* d_ptr = dynamic_cast<const D*>(&M)) { S::EQUAL(M); Ra = d_ptr->Ra; } return *this; }
这种方式需要添加类型检查,因为基类虚函数的参数是const S&,传入的对象可能不是D类型。
内容的提问来源于stack exchange,提问作者Barzoius Mecca
相关产品推荐
相关产品推荐

