I always thought that in D interface inheritance is always virtual, i.e. you only inherit it once even if it is specified twice (or more) within hierarchy.
Until I got an assertion on the following test (reduced from a real example):
interface Foo
{
}
class Bar : Foo
{
}
class Baz : Bar, Foo
{
}
void main()
{
Baz baz = new Baz();
Bar bar = baz;
Foo foo1 = bar;
Foo foo2 = baz;
assert(foo1 is foo2);
}
foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
The test above passes for C# (http://ideone.com/xK5Mu) and C++ (http://ideone.com/MnnL8 virtual inheritance used, fails otherwise, of course).

Trass3r <un@known.com> wrote:
>> void main()
>> {
>> Baz baz = new Baz();
>> Bar bar = baz;
>> >> Foo foo1 = bar;
>> Foo foo2 = baz;
>> >> assert(foo1 is foo2);
>> }
>>>>>> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
>> Looks fine?! Isn't foo1 == foo2 what you want?
He mentioned that the code asserts. I say this is fishy, but I don't know
if it should assert or not.
--
Simen

On Fri, 01 Oct 2010 19:36:11 +0400, Trass3r <un@known.com> wrote:
>> void main()
>> {
>> Baz baz = new Baz();
>> Bar bar = baz;
>> >> Foo foo1 = bar;
>> Foo foo2 = baz;
>> >> assert(foo1 is foo2);
>> }
>>>>>> foo1 and foo2 have the same type and point to the same object. Yet they have different addresses. Is it a bug, or a feature?
>> Looks fine?! Isn't foo1 == foo2 what you want?
Sadly, opEquals is only defined for Objects, not interfaces:
Error: function object.opEquals (Object lhs, Object rhs) is not callable using argument types (Foo,Foo)
Besides, I put `is' on purpose. With that assertion I make sure that references are *same*, not that they are equal.