在C ++中使用接口进行多重继承

时间:2014-06-04 18:34:43

标签: c++ oop

多重继承,接口类是一个很好的设计实践吗?

它似乎工作,使运行gtest unittest套件方便。那么在下面的例子中,B类的多重继承是一种糟糕的设计实践吗?

#include <stdio.h>

class BInterface {
 public:
    virtual ~BInterface() {}
    virtual void idb() = 0;
};

class A {
 public:
    A() {}
    void ida() {printf("I am A\n");}
};

class B : public A, public BInterface {  // ###########  Is this OK?  ############
 public:
    B() {}
    void idb() {printf("I am B\n");}
};

int main() {

    B BObject;

    BInterface* BI = &BObject;

    BI->idb();

    return 0;
}

编辑:我可以继承接口类,但在这种情况下是多重继承是一种糟糕的设计,考虑到大多数代码专家建议不要使用多重继承。

2 个答案:

答案 0 :(得分:5)

技术上可以继承接口类。完成他们为之设计的所有内容之后。它是否能够提高设计水平是另一回事,如果不考虑特定的设计,就无法做出决定。

在C ++中,使接口继承virtual有一些优点,特别是你可以在实现中继承,但它的效率也会有轻微的成本。

Microsoft的COM是基于接口的体系结构的一个示例,它不使用virtual接口继承。使用virtual会使COM类的C视图复杂化 1 。但对于纯粹的C ++内部代码,(希望)没有这样的考虑。


关于

  

在下面的示例中,B类的多重继承是一种糟糕的设计实践吗?

...示例中没有类B的多重继承,就像我写这个一样。

一般来说,多次继承接口类是可以的,但是你只想继承一次实现类。


1)通过不使用virtual继承或等效方案,COM对象可能有多个类型为IUnknown的基类子对象,这使COM对象身份概念复杂化。基本上,它通过提供一个成员函数来解决,其中客户端代码可以请求指定接口的接口指针,其中IUnknown需要特殊处理,始终返回指向标识定义子对象的指针。类似的身份考虑可能适用于普通的C ++接口继承。

答案 1 :(得分:0)

关于设计,使用接口库进行多重继承没有什么不好或特别好。如果这是做你需要做的最简单的方法,那就去做吧。

同样适用于更复杂的多重继承。在C ++中,没有必要避免它,但如果你使用它,你应该知道你在做什么。甚至带有虚拟基座的菱形继承也可以使用,但不应轻易使用。它往往会让你的读者感到困惑。