多重继承,接口类是一个很好的设计实践吗?
它似乎工作,使运行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;
}
编辑:我可以继承接口类,但在这种情况下是多重继承是一种糟糕的设计,考虑到大多数代码专家建议不要使用多重继承。
答案 0 :(得分:5)
技术上可以继承接口类。完成他们为之设计的所有内容之后。它是否能够提高设计水平是另一回事,如果不考虑特定的设计,就无法做出决定。
在C ++中,使接口继承virtual
有一些优点,特别是你可以在实现中继承,但它的效率也会有轻微的成本。
Microsoft的COM是基于接口的体系结构的一个示例,它不使用virtual
接口继承。使用virtual
会使COM类的C视图复杂化 1 。但对于纯粹的C ++内部代码,(希望)没有这样的考虑。
关于
“在下面的示例中,B类的多重继承是一种糟糕的设计实践吗?
...示例中没有类B的多重继承,就像我写这个一样。
一般来说,多次继承接口类是可以的,但是你只想继承一次实现类。
1)通过不使用virtual
继承或等效方案,COM对象可能有多个类型为IUnknown
的基类子对象,这使COM对象身份概念复杂化。基本上,它通过提供一个成员函数来解决,其中客户端代码可以请求指定接口的接口指针,其中IUnknown
需要特殊处理,始终返回指向标识定义子对象的指针。类似的身份考虑可能适用于普通的C ++接口继承。
答案 1 :(得分:0)
关于设计,使用接口库进行多重继承没有什么不好或特别好。如果这是做你需要做的最简单的方法,那就去做吧。
同样适用于更复杂的多重继承。在C ++中,没有必要避免它,但如果你使用它,你应该知道你在做什么。甚至带有虚拟基座的菱形继承也可以使用,但不应轻易使用。它往往会让你的读者感到困惑。