Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-面向对象设计-多重继承和纯虚拟方法_C++_Oop - Fatal编程技术网

C++ C++;-面向对象设计-多重继承和纯虚拟方法

C++ C++;-面向对象设计-多重继承和纯虚拟方法,c++,oop,C++,Oop,我有一个问题,我不知道如何正确解决 class A : public B, public C { virtual void GetSomethingElse() { } } class B { public void GetSomething() { GetSomethingElse(); } virtual void GetSomethingElse() = 0; } class C { virtual void G

我有一个问题,我不知道如何正确解决

class A : public B, public C
{
   virtual void GetSomethingElse()
   {
   }
}

class B
{
   public void GetSomething()
   {      
      GetSomethingElse();
   }

   virtual void GetSomethingElse() = 0;
}

class C
{
   virtual void GetSomethingElse() = 0;
}
基本上,我有两个抽象类
B
C
。通常,我只需要继承其中一个,但在某些特定情况下,我需要两个

如何使用需要从
B
调用的
GetSomethingElse()
方法正确解决此问题。如果我只继承
B
,它将在child中实现。如果只从
C
,一切仍然正常。
但是,如果我继承
B
C
,我有一些“奇怪”的设计,这是钻石继承问题,但它完全不同。

因为它们是抽象的,所以需要覆盖
类A
中的方法。 每个对象都将知道它是
B
还是
C
,因此它将调用正确的函数

但是,如果类C没有函数
GetSomething()?因此,如果A不是B,因为is没有这样的呼叫,那么一定是出了问题

另一点是派生
virtual
,因此这两个相同的函数被认为是相同的:
类A:虚拟公共B,虚拟公共C


你有没有考虑过做B和C的父母?如果它们没有共同的父级,为什么它们都有一个同名的函数?

正如您已经提到的,这与菱形问题完全不同

class A : public B, public C
{
   virtual void GetSomethingElse()
   {
   }
}

class B:public class D
{
   public void GetSomething()
   {      
      GetSomethingElse();
   }

   virtual void GetSomethingElse()
   {
   }
}

class C:public class D
{
   virtual void GetSomethingElse()
   {
   }
}

//here's the only pure virtual base class
 class D
{
   virtual void GetSomethingElse() = 0;
}
你的设计是正确的,没有问题。将GetSomeThingElse设置为纯虚拟就是强制子级定义它。如果是因为C或B而定义它不是设计问题。
如果其中一个是纯虚拟的,另一个(B或C)是虚拟的,那么您就会遇到设计问题,因为其中一个为您提供了选择,而另一个为您提供了义务。

我没有看到继承自B和C的问题。您到底遇到了什么问题?您能提供实际生成您希望解决的错误的代码吗?