Re: Multiple Inheritance vs. Interface
On 23 sep, 16:32, Stuart <DerTop...@web.de> wrote:
On 9/20/12 "lieve again" wrote:
Hi!
I have a question regarding the implementation of the multiple
inheritance in C++.
As far as I know, the implementation problem of multiple inheritance
(one of them) in every programming language is the need for an extra
pointer for each new inherited class.
For example:
class Base1{
// hidden Base1_vtr = &Base1_vtbl[0]
virtual void func();
virtual void func2();
virtual void func3();
};
class Base2{
// hidden Base2_vtr = &Base2_vtbl[0]
virtual base2func();
virtual base2func2();
};
class NormalInheritance : public Base1 {
// hidden Base1_vtr = &Base1_vtbl[0]
virtual void anotherFunc();
};
class MultipleInheritance : public Base1, Base2 {
// hidden Base1_vtr = &Base1_vtbl[0]
// hidden Base2_vtr = &Base2_vtbl[0]
virtual void anotherFunc();
};
So, sizeof(Base1) == sizeof(Base2) == sizeof(NormalInheritance)=
== 4
bytes (only one virtual pointer)
but sizeof(MultipleInheritance) == 8 bytes
if class MultipleInheritance would inherit from another Base3, the
size would be 12 bytes and so on.
That's right.
So with multiple inheritance we ends with big classes because of the
need of extra virtual pointers,
to avoid that, almost every language doesn't implement multiple
inheritance but Interfaces,
I don't think that this is the reason why the implementors of other
languages chose a single-inheritance approach. In my opinion it is the
complexity of a multiple-inheritance language that puts off a lot of
low-end programmers, but these programmers are the bulk of the
industry's employees.
where one
can only inherit more than one class but being that classes abstract
or pure virtual, like:
class Base1{
virtual void func() = 0;
virtual void func3();
};
class MixedClass : public NormalClass implements Base1, Base2,
Base...
My question is: Don't we have the same implementation problem as in=
C+
+?
Yes, single inheritance languages that are implemented using vtables
still suffer from this problem.
> Because even being these classes
abstract, they need a virtual pointer. Why do they impose that rule
in languages like C#, Java, D...?
Someone know the reason?
We can only guess. Unfortunately, there is no single person that has
perceived the Java programming language, so we cannot ask somebody (in
contrast to Mr. Stroustrup, who, although rarely, can be seen in this
newsgroup).
Regards,
Stuart
Ok, so the main reason for not implementing multiple inheritance
(without workarounds) is the complexity added to the programmers
(learning curve) and to the compiler developers (diamond
problem, ...). I thought maybe making the interfaces pure virtual,
there was a way to avoid the extra vpointers and I wanted to know how.
Then if I start adding pure virtual classes to impose the derived
classes with some kind of features like:
class Derived : implements Readable, Writeable, Comparable,
Convertible ...
regardless of the programming language, we are ending with instances
of the derived classes having 20 bytes or more even being those
classes with no members or empty. It is good to know.
Regards,
lieve