Here is a further extension to the example in An example of multiple inheritance, with an additional interface
i-foo-ex
.that inherits from
i-foo
as in the following IDL:
[ uuid(7D9EB761-E4E5-11D5-BF02-000347024BE1) ]
interface IFooEx : IFoo
{
HRESULT meth4();
}
This interface has the following additional implementations:
i-foo-ex
:(define-com-implementation foo-ex-impl-1 ()
()
(:interfaces i-foo-ex))
(define-com-method meth1 ((this foo-ex-impl-1))
s_ok)
(define-com-method meth2 ((this foo-ex-impl-1))
s_ok)
(define-com-method meth3 ((this foo-ex-impl-1))
s_ok)
(define-com-method meth4 ((this foo-ex-impl-1))
s_ok)
(define-com-implementation foo-ex-impl-2 (foo-impl-12
foo-ex-impl-1)
()
(:interfaces i-foo-ex))
In step
2
, the class
foo-ex-impl-2
implements the interface
i-foo-ex
and is a subclass of
foo-ex-impl-1
, which implements
i-foo
. When the following form is evaluated with
p-foo-ex
created from an instance of
foo-ex-impl-2
:
(let ((object (make-instance 'foo-ex-impl-2)))
(with-temp-interface (p-foo-ex)
(nth-value 1 (query-object-interface
foo-ex-impl-2
object
'i-foo-ex))
(with-com-interface (call-p-foo i-foo-ex) p-foo-ex
(values (call-p-foo meth1)
(call-p-foo meth2)
(call-p-foo meth3)
(call-p-foo meth4)))))
the four values are
S_OK
,
E_NOTIMPL
,
S_OK
and
S_OK
.
Note that, even though foo-ex-impl-2 only explicitly implements
i-foo-ex
, the methods
meth1
,
meth2
and
meth3
were declared in its parent interface
i-foo
. This means that their definitions (including the "unimplemented" definition of
meth2
) are inherited from
foo-impl
(via
foo-impl-12
), because
foo-impl-12
is before
foo-ex-impl-2
in the class precedence list of
foo-ex-impl-2
. Only
meth4
, which is declared in
i-foo-ex
, is inherited from
foo-ex-impl-1
.