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

use*_*541 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Che*_*Alf 5

从技术上讲,继承接口类是可以的.毕竟这就是他们的设计目标.它是否使设计水平感是另一回事,不考虑特定设计就无法做出决定.

在C++中,有一些优点可以实现接口继承virtual,特别是您可以在实现中继承,但它的效率也会略有降低.

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


关于

"在下面的例子中,B类的多重继承是一个糟糕的设计实践?

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

通常,多次继承接口类是可以的,但是您只想继承一次实现类.


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