C++中基于非类型模板参数的条件继承与虚函数覆写问题
C++中基于非类型模板参数的条件继承与虚函数覆写问题
嘿,我明白你的需求啦!你现在有两个带纯虚函数的基类,B里有纯虚函数f(),C里有纯虚函数g(),你想创建一个子类A,根据非类型bool模板参数来决定继承B还是C,同时还要正确覆写对应的纯虚函数对吧?先把你的基类代码再明确一下:
class B { public: virtual void f() = 0; }; class C { public: virtual void g() = 0; };
接下来我给你两种靠谱的实现方式,都是C++标准里支持的写法:
方法一:用std::conditional结合SFINAE实现
这种方式可以用同一个模板类搞定两种继承情况,借助std::conditional动态选择基类,再通过SFINAE机制针对性实现对应的虚函数:
#include <type_traits> #include <iostream> // 基类定义 class B { public: virtual void f() = 0; }; class C { public: virtual void g() = 0; }; // 条件继承的子类A template <bool InheritFromB> class A : public std::conditional_t<InheritFromB, B, C> { public: // 当模板参数为true(继承B)时,才实例化这个f()的覆写版本 template <bool Flag = InheritFromB, std::enable_if_t<Flag, bool> = true> void f() override { std::cout << "继承B的A:正在执行f()的实现\n"; } // 当模板参数为false(继承C)时,才实例化这个g()的覆写版本 template <bool Flag = InheritFromB, std::enable_if_t<!Flag, bool> = true> void g() override { std::cout << "继承C的A:正在执行g()的实现\n"; } };
方法二:模板特化实现(更直观)
如果你觉得SFINAE的写法有点绕,那模板特化的方式会更直白——我们分别为true和false的模板参数情况,定义不同版本的A类:
#include <iostream> // 基类定义 class B { public: virtual void f() = 0; }; class C { public: virtual void g() = 0; }; // 先声明模板类A的框架 template <bool InheritFromB> class A; // 特化:当模板参数为true时,A继承B并覆写f() template <> class A<true> : public B { public: void f() override { std::cout << "继承B的A:f()已实现\n"; } }; // 特化:当模板参数为false时,A继承C并覆写g() template <> class A<false> : public C { public: void g() override { std::cout << "继承C的A:g()已实现\n"; } };
验证示例
不管用哪种方法,你都可以像下面这样使用A类,完全符合你的条件继承需求:
int main() { A<true> a_from_b; a_from_b.f(); A<false> a_from_c; a_from_c.g(); return 0; }
备注:内容来源于stack exchange,提问作者toxic
相关产品推荐
相关产品推荐

