隐藏从(C ++)隐式派生的子类中的方法

时间:2014-03-12 13:09:19

标签: c++ multiple-inheritance

女士们,先生们,

请参阅下面的编码示例(运行源代码)。我的问题是让这个例子更优雅。

这段代码是什么:我有一个类CRTP,它通过将函数DT注入派生类来装饰它的派生类func。此派生类为AB。此外,B也来自A。在查看表达式func()时,在尝试解析调用哪个b.func()方法时,这将导致编译时的ambiguitiy。要解决此歧义,需要将using CRTP< B >::func添加到课程B。另请注意,由于func方法的返回类型,它始终是返回的DT类型。

我的问题是:是否有更简单/更快捷的方式来“忽略”或“禁用”通过B的间接继承引入类CRTP< A >的那些部分,而不是明确使用{{1}每个using方法的短语? (想象一下,CRTP< A >将有更多的方法(可能是类型),它将添加到它的CRTP类中。

非常感谢您的时间和见解

DT

2 个答案:

答案 0 :(得分:1)

可悲的是,没有。你的方法是C ++最好的方法。没有办法&#34;忽略&#34;通过CRTP<A>的间接继承引入的部分。当您实现继承时,您对编译器做出了严格的承诺,即派生类实际上将包含其基类的公共和受保护功能。

答案 1 :(得分:1)

我担心你会使用多重继承将自己画成一个角落。

如果你可以拥有线性继承:B -> CRTP<B, A> -> A -> CRTP<A>那么你就是金牌,因为CRTP<B, A>::func会“自然地”隐藏A::func(本身继承自CRTP<A>)。

如果你总是继承同一级别,那很容易;否则会变得非常复杂。请参阅demo

template< typename DT, typename... Bases >
struct CRTP: private Bases...
{
    friend DT; // so that DT can access the private bases
    DT func( void ) { return DT(); }
};