在c++中实现多个接口

Aar*_*kan 2 c++ oop

我的接口层次结构如下:

class A
{
public:
 void foo() = 0;
};

class B: public A
{
public:
void testB() = 0;
};

class C: public A
{
public:
void testC() = 0;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想通过相同的层次结构(即基类)实现这些接口AImplBImplCImpl我不确定如何从相应的接口派生它们。

请帮忙。提前致谢。

Max*_*kin 7

您可以使用单独的模板实现每个单独的接口,然后链接模板以构造派生对象,就像从构建块一样。古老的 ATL 库也使用这种方法来实现 COM 接口(对于我们这些年纪足够大的人来说)。

请注意,为此您不需要虚拟继承。

我稍微修改了您的示例以获得更复杂的推导,C -> B -> A以展示此方法如何轻松扩展:

#include <stdio.h>

// Interfaces

struct A
{
    virtual void foo() = 0;
};

struct B : A
{
    virtual void testB() = 0;
};

struct C : B
{
    virtual void testC() = 0;
};

// Implementations

template<class I>
struct AImpl : I
{
    void foo() { printf("%s\n", __PRETTY_FUNCTION__); }
};

template<class I>
struct BImpl : I
{
    void testB() { printf("%s\n", __PRETTY_FUNCTION__); }
};

template<class I>
struct CImpl : I
{
    void testC() { printf("%s\n", __PRETTY_FUNCTION__); }
};


// Usage

int main() {
    // Compose derived objects from templates as from building blocks.
    AImpl<A> a;
    BImpl<AImpl<B> > b;
    CImpl<BImpl<AImpl<C> > > c;

    a.foo();

    b.foo();
    b.testB();

    c.foo();
    c.testB();
    c.testC();
}
Run Code Online (Sandbox Code Playgroud)

输出:

void AImpl<I>::foo() [with I = A]
void AImpl<I>::foo() [with I = B]
void BImpl<I>::testB() [with I = AImpl<B>]
void AImpl<I>::foo() [with I = C]
void BImpl<I>::testB() [with I = AImpl<C>]
void CImpl<I>::testC() [with I = BImpl<AImpl<C> >]
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 5

虽然我通常在建议多重继承之前会三思而后行。如果您的需求确实没有您所说的那么复杂,那么只需虚拟地继承接口和实现即可。

class A
{
public:
  void foo() = 0;
};

class B: virtual public A
{
public:
  void testB() = 0;
};

class C: virtual public A
{
public:
  void testC() = 0;
};

class AImpl : virtual public A
{
 ...
}

class BImpl : virtual public B, virtual public AImpl
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

虚拟继承将确保和A之间仅共享一个子对象。所以你应该清楚。然而,对象的大小将会增加。因此,如果这是一个问题,请重新考虑您的设计。BAImpl