C++多重继承函数名称冲突

pae*_*bal 3 c++ oop templates

上下文:当出现以下问题时,我正在讨论C#与Java的工作,我想知道如何(或者如果)在C++中优雅地解决它.

比方说,你有两个类AB(其细节并不重要),然后有两只模板类GH描述是这样的:

template <typename T>            | template <typename T> 
class G                          | class H
{                                | {
   public :                      |    public :
      T * foo() ;                |       virtual T * foo() = 0 ;
      // etc.                    |       // etc.
} ;                              | } ;
Run Code Online (Sandbox Code Playgroud)

然后我们有类CD描述如下:

class A { /* ... */ } ;
class B { /* ... */ } ;

class C : public G<A>, public G<B>
{
} ;

class D : public H<A>, public H<B>
{
   // ???
} ;
Run Code Online (Sandbox Code Playgroud)

我希望能够从和foo 调用C方法.我希望能够覆盖来自和的方法.fooG<A>G<B>DfooH<A>H<B>

最后,我希望能够在以下示例中使用C和D:

C c ;
A * a = c.??? ; (I want to call G<A>::foo())
B * b = c.??? ; (I want to call G<B>::foo())

D d ;
A * a = c.??? ; (I want to call H<A>::foo())
B * b = c.??? ; (I want to call H<B>::foo())
Run Code Online (Sandbox Code Playgroud)

总有办法做到这一点(我有一些想法),但我对一系列优雅而安全的方法感兴趣,包括优点/缺点.

那么,你会怎么做?

Kon*_*lph 5

我能想到的两种方式:

C x;

x.G<A>::foo(); // 1
static_cast<G<A>&>(x).foo(); // 2
Run Code Online (Sandbox Code Playgroud)

即:要么显式限定函数的名称,要么在类型层次结构中进行向上转换.