你有钻石继承有用的例子吗?

时间:2014-10-15 18:11:57

标签: c++

我有兴趣找到钻石继承是一件好事的例子。我只是理论上读到的,并没有在实践中遇到它。

2 个答案:

答案 0 :(得分:3)

钻石继承的最佳例子是std :: iostream库。这种设计需要彻底的测试。一般来说,我们应尽可能避免这种类型的结构,以便以后减少维护问题。

答案 1 :(得分:1)

它有时会出现在基于界面的编程中,但如果你小心的话可以避免它。这可能是最好的例子;否则描述会变成沙拉字样:

// Foo.h

struct IFoo
{
   virtual ~IFoo() {}
   virtual int Bar() = 0;
   virtual int Baz() = 0;
};


// FooBase.h

#include "Foo.h"

class FooBase : public IFoo
{
public:
   int Bar() override { return 0; } // default implementation
   int Baz() override { return 0; } // default implementation
};


// ConcreteFoo.h

#include "Foo.h"

class ConcreteFoo : public IFoo
{
public:
   static ConcreteFoo* Create();
   virtual void SayHello() = 0;
};


// ConcreteFoo.cpp

#include "ConcreteFoo.h"
#include <iostream>

class ConcreteFooImpl : public ConcreteFoo, public FooBase
// Diamond! Both ConcreteFoo and FooBase descend from IFoo.
{
public:
   int Bar() override { return 1; }

   // use default Baz() from FooBase

   void SayHello() override { std::cout << "Hello!"; }
};

ConcreteFoo* ConcreteFoo::Create()
{
   return new ConcreteFooImpl();
}

当您编写新代码时,通常可以避免首先创建这种类型的安排。但是如果你在重构中破坏遗留代码中的依赖关系,你有时会得到一些类似上面的东西作为停止(也许是最后一站,取决于它困扰你多少:)。