为编译需求在模板类中针对部分模板参数隐藏纯虚方法
解决方案:模板特化基类+针对性实现
核心问题在于通用基类A
实现代码(兼容C++11及以上)
#include <string> // 通用基类:仅声明必须实现的foo() template<typename T> class A { public: virtual int foo() = 0; }; // 特化A<int>:额外添加bar()纯虚要求 template<> class A<int> { public: virtual int foo() = 0; virtual int bar() = 0; }; // 通用B模板:仅实现foo() template<typename T> class B : public A<T> { public: int foo() override { return 5; } }; // 特化B<int>:额外实现bar()以满足基类要求 template<> class B<int> : public A<int> { public: int foo() override { return 5; } int bar() override { int v; return v; } }; int main(int argc, char * argv[]) { B<int> b1; b1.foo(); b1.bar(); // 正常编译 B<std::string> b2; b2.foo(); // 正常编译,无需实现bar() }
更紧凑的C++20版本(利用requires约束)
如果你的编译器支持C++20,可以不用特化B,直接用约束限定bar()的生效范围:
#include <string> #include <type_traits> template<typename T> class A { public: virtual int foo() = 0; }; template<> class A<int> { public: virtual int foo() = 0; virtual int bar() = 0; }; template<typename T> class B : public A<T> { public: int foo() override { return 5; } // 仅当T为int时,该bar()才会被实例化,满足A<int>的要求 int bar() override requires std::is_same_v<T, int> { T v; return v; } }; int main(int argc, char * argv[]) { B<int> b1; b1.foo(); b1.bar(); B<std::string> b2; b2.foo(); }
方案原理
通过特化基类A,我们让模板参数int对应包含bar()纯虚函数的基类,其他参数对应仅包含foo()的基类。这样:
- B
必须实现 bar()以满足基类要求,符合你调用b1.bar()的需求 - B
继承的基类没有 bar()的强制要求,因此无需实现该方法,实例化和调用foo()都能正常通过
内容的提问来源于stack exchange,提问作者Arnaud
相关产品推荐
相关产品推荐

