我有兴趣找到钻石继承是一件好事的例子。我只是理论上读到的,并没有在实践中遇到它。
答案 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();
}
当您编写新代码时,通常可以避免首先创建这种类型的安排。但是如果你在重构中破坏遗留代码中的依赖关系,你有时会得到一些类似上面的东西作为停止(也许是最后一站,取决于它困扰你多少:)。