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

C++ multiple inheritance function name collision

本文关键字:冲突 函数 继承 C++      更新时间:2023-10-16

上下文:我在工作中讨论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.
} ;                              | } ;

然后我们将类CD描述为:

class A { /* ... */ } ;
class B { /* ... */ } ;
class C : public G<A>, public G<B>
{
} ;
class D : public H<A>, public H<B>
{
   // ???
} ;

我希望能够为C调用G<A>中的方法fooG<B>中的foo。并且我希望能够为D重写H<A>H<B>中的方法foo

最后,我希望能够像下面的例子一样使用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())

总有一些方法可以做到这一点(我有一些想法),但我感兴趣的是一系列优雅安全的方法,包括利弊。

那么,你会怎么做呢

我能想到的两种方法:

C x;
x.G<A>::foo(); // 1
static_cast<G<A>&>(x).foo(); // 2

也就是说:要么显式限定函数的名称,要么在类型层次结构中向上转换。

如何,重载和使用不同的参数:

template <typename T>
class G
{
public:
    T * foo(T &a) {/* ... */};
    // etc.
};
class A
{
public:
    /* ... */
};
class B
{
    public:
    /* ... */
};
class C : public G<A>, public G<B>
{
public:
    using G<A>::foo;
    using G<B>::foo;
};
int main()
{
    C c;
    A a;
    B b;
    c.foo(a);
    c.foo(b);
    return 0;
}