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的问题。您到底遇到了什么问题?您能提供实际生成您希望解决的错误的代码吗?