Polymorphisme(方法签名掩蔽)引发编译错误的最优解决方案
问题原因与解决方案
错误原因
编译错误的核心是C++的名字隐藏规则:当派生类中定义了与基类同名的函数(哪怕参数列表不同),基类中所有同名的非虚函数都会被隐藏。你的代码里,派生类derived定义了print(const std::string&),导致基类的无参print()在派生类作用域中不可见,调用d.print()时编译器找不到匹配的无参函数,因此触发报错。
最优解决方案
在派生类的public区段添加using base::print;声明,将基类的print方法引入派生类作用域,既不需要重命名方法,也不用重复实现无参print(),同时保留多态的动态绑定特性。
修改后的代码如下:
#include <iostream> class base{ public: void print() { print("Hello from "); } private: virtual void print(const std::string & message) { std::cout << message << " base class !! \n"; } }; class derived: public base{ public: using base::print; // 引入基类的print方法 private: void print(const std::string & message) override { std::cout << message << " derived class !! \n"; } }; int main() { base b; b.print(); // 输出:Hello from base class !! derived d; d.print(); // 输出:Hello from derived class !! return 0; }
方案说明
using base::print;会将基类中所有名为print的方法(包括无参版本)引入派生类的public作用域,编译器调用d.print()时就能匹配到基类的无参print()。- 无参
print()内部调用的print(const std::string&)是虚函数,会根据对象实际类型动态绑定到派生类的实现,保证多态效果正常生效。
内容的提问来源于stack exchange,提问作者casaDePapel
相关产品推荐
相关产品推荐

