C++ 确保一个类不从两个接口继承

C++ 确保一个类不从两个接口继承,c++,c++14,C++,C++14,我有这个问题。我们开发并使用了一个框架。我们有一些界面,这个框架的用户需要实现。我想确保这些接口中的两个永远不能在同一个类上实现。这里有一个例子 class A{ void a() = 0; }; class B{ void b() = 0; }; class C: public A, public B { // This should give error }; class D: public A{ // OK }; 到目前为止,我想也许我可以使用static\u assert和s

我有这个问题。我们开发并使用了一个框架。我们有一些界面,这个框架的用户需要实现。我想确保这些接口中的两个永远不能在同一个类上实现。这里有一个例子

class A{
  void a() = 0;
};
class B{
  void b() = 0;
};

class C: public A, public B { // This should give error
};
class D: public A{ // OK
};
到目前为止,我想也许我可以使用
static\u assert
std::is\u convertible
,但我不知道怎么做

编辑: 我不知道谁将要编写派生类,所以如果可能的话,我希望在基本接口中使用它。基本上假设我不能访问派生类,因为它们不在我们的代码库中


谢谢。

写下自己的特点如下:

模板
结构没有基;
模板
结构没有基
:std::true_type{};
模板
结构没有基
:std::conditional\u t<
标准::是的基础,
std::真_类型,
没有基础
> { };
模板
结构只有一个基;
模板
结构只有一个基
:std::false_type{};
模板
结构只有一个基
:std::conditional\u t<
std::是v的基础吗,
std::真_类型,
std::false_类型
> { };
模板
结构只有一个基
:std::conditional\u t<
std::是v的基础吗,
没有基地,
只有一个基础
> { };
然后像这样使用它:

类别MyClass:公共A、公共B
{
静态断言(只有一个基::值,“Error”);
};
此外,作为此框架的开发人员,您可以提供一些检查特征:

模板
使用is\u valid\u class=只有一个\u基;
并使用它:

类别MyClass:公共A、公共B
{
静态断言(是有效的类::值,“错误”);
};

“我想确保这些接口中的两个永远不能在同一个类上实现。”如果用户能够做到这一点,那么它在功能上是有效的、有效的,并且在设计上是清晰的,没有理由用破坏的接口约定来戏弄用户。看来你要写一篇文字冒险了!这不是我的设计,我不能改变它。我在代码中看到,原始作者进行了动态转换,并给出了最糟糕的运行时错误。我想看看我是否能把它至少转换成编译时错误动态转换成什么?你不想告诉我,他试图强制转换所有被破坏的接口类,计算数量,如果发现不止一次,就会抛出一个错误?不!:-)谁来为改善界面的不好买单?你看到了我所经历的那种头痛吗?我觉得你(仅仅)没有技术问题。去你的老板那里,要求更好的团队教育,创建更好的代码指南,参加有益的代码评审,不要遵循学术规则(多重继承是一种评估习惯),投资软件资本,这可能是值得的!“改进”坏主意对我来说毫无帮助。OP问他如何保证没有人从两个接口继承。如果用户如何“滥用”界面,为什么该用户应该自己进行检查。在您的情况下,我可以在assert子句中写入所有内容。我看不出这个有什么用!谢谢你的回答。但是,因为这是一个框架,所以假设我没有访问派生类的权限。我只知道框架中的接口。我可以把这些断言放在接口的某个地方吗?@Ashkan:没错!这个“解决方案”是没有的,因为它需要用户自己说:我做错了。毫无帮助:-)@Klaus我认为没有这样的方法来保证没有多接口继承。唯一的方法是假设口头约定只继承一个接口,或者在用户的类继承2个或多个接口时,放置
是否有效\u class
断言以引发编译时错误可能是?但若你们的答案并没有回答OPs的问题,为什么它仍然存在。在我看来,你的代码毫无帮助,因为最终用户必须自己写支票来检查自己是否做了错事。对不起,你能帮我理解你的答案有什么好处吗?不知道人们会投这个答案…:-)