C++模板抽象基类调用接口定义派生类实现的虚函数报错如何解决
问题原因分析
- 第一个编译错误:C++模板的两阶段查找规则要求,对不依赖模板参数的名称,会在模板定义阶段就进行查找。你的基类
IPriorityQueue<K,V>是依赖模板参数K和V的依赖型基类,模板定义阶段不会扫描它的成员,因此直接调用size()编译器无法找到对应声明。 - 第二个链接错误:你使用
IPriorityQueue<K,V>::size()的写法属于静态调用,会直接寻址IPriorityQueue类的size实现,而size是纯虚函数没有实体,自然会报未定义引用的链接错误,你需要的是虚函数的动态调用,不能加完全限定名。
解决方法
两种方案任选其一即可:
方案1:调用时加this->前缀
修改APriorityQueue的empty实现:
bool empty(void) const { return !this->size(); }
this指针是依赖模板参数的,会将size的查找推迟到模板实例化阶段,此时基类成员已经可见,且调用走虚函数分发,会调用最终派生类的size实现,完全符合设计预期。
方案2:在抽象基类中增加using声明
在APriorityQueue类的public区域显式引入基类的size声明:
template <typename K, typename V> class APriorityQueue : virtual public IPriorityQueue<K, V> { public: using IPriorityQueue<K,V>::size; bool empty(void) const { return !size(); } };
显式告知编译器size来自依赖型基类,无需在定义阶段查找,调用同样走虚函数分发逻辑。
设计可行性评估
该设计方案完全可行,属于非常典型的分层复用设计:接口类定义统一契约,抽象基类实现公共的、和底层存储无关的通用逻辑,具体派生类实现和存储结构绑定的核心接口,符合接口隔离、单一职责的设计原则。
内容的提问来源于stack exchange,提问作者Mampac
相关产品推荐
相关产品推荐

