Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Multiple ineritance question (http://www.velocityreviews.com/forums/t278749-multiple-ineritance-question.html)

Mattias B 10-28-2003 07:48 AM

Multiple ineritance question
 
Hello!

I have s quick question regarding multiple ineritance that I hope that
someone will have the time to look at. I have the following classes that
I try to compile and use:

class A
{
public:
virtual void foo() = 0;
};

class B : public A
{
public:
virtual void bar() = 0;
};

class A_Impl : public A
{
public:
void foo() { }
};

class B_Impl : public A_Impl, public B
{
public:
void bar() { }
};

Now when I try to create an instance of B_Impl I get the following error
message when I try to compile with gcc:

main.cpp: In function `int main()':
main.cpp:7: cannot allocate an object of type `B_Impl'
main.cpp:7: because the following virtual functions are abstract:
A.h:7: virtual void A::foo()

Can anyone tell me why this is? Surely B_Impl has inerited A_Impl's
implementation of void foo()?

Regards,
Mattias


Andrey Tarasevich 10-28-2003 08:08 AM

Re: Multiple ineritance question
 

Mattias B wrote:
> ...
> I have s quick question regarding multiple ineritance that I hope that
> someone will have the time to look at. I have the following classes that
> I try to compile and use:
>
> class A
> {
> public:
> virtual void foo() = 0;
> };
>
> class B : public A
> {
> public:
> virtual void bar() = 0;
> };
>
> class A_Impl : public A
> {
> public:
> void foo() { }
> };
>
> class B_Impl : public A_Impl, public B
> {
> public:
> void bar() { }
> };
>
> Now when I try to create an instance of B_Impl I get the following error
> message when I try to compile with gcc:
>
> main.cpp: In function `int main()':
> main.cpp:7: cannot allocate an object of type `B_Impl'
> main.cpp:7: because the following virtual functions are abstract:
> A.h:7: virtual void A::foo()
>
> Can anyone tell me why this is? Surely B_Impl has inerited A_Impl's
> implementation of void foo()?
> ...


'B_Impl' has two subobjects of type 'A'. One comes through base class
subobject 'A_Impl', another - through base class subobject 'B'. Virtual
function 'foo' from the former has 'A_Impl::foo' as final overrider,
which is not pure. Virtual function 'foo' from the latter has 'A::foo'
as final overrider, which is _pure_. For this reason, as defined in
10.4/4 class 'B_Impl' is an abstract class and cannot be instantiated.

Provide a non-pure final overrider for all 'foo' functions is your class
'B_Impl' and the code will compile. If I understand your intent
correctly, you need something like this

class B_Impl : public A_Impl, public B
{
public:
void bar() {}
void foo() { A_Impl::foo(); }
};

You should probably also decide whether you really need two distinct
base class subobjects of type 'A' in 'B_Impl' and, maybe, use 'A' as
virtual base class.

--
Best regards,
Andrey Tarasevich
Brainbench C and C++ Programming MVP


jeffc 10-28-2003 05:04 PM

Re: Multiple ineritance question
 

"Mattias B" <brasse@ludd.luth.se> wrote in message
news:3f9e20a2$0$166$cc7c7865@news.luth.se...
> Hello!
>
> I have s quick question regarding multiple ineritance that I hope that
> someone will have the time to look at. I have the following classes that
> I try to compile and use:
>
> class A
> {
> public:
> virtual void foo() = 0;
> };
>
> class B : public A
> {
> public:
> virtual void bar() = 0;
> };
>
> class A_Impl : public A
> {
> public:
> void foo() { }
> };
>
> class B_Impl : public A_Impl, public B
> {
> public:
> void bar() { }
> };
>
> Now when I try to create an instance of B_Impl I get the following error
> message when I try to compile with gcc:
>
> main.cpp: In function `int main()':
> main.cpp:7: cannot allocate an object of type `B_Impl'
> main.cpp:7: because the following virtual functions are abstract:
> A.h:7: virtual void A::foo()
>
> Can anyone tell me why this is? Surely B_Impl has inerited A_Impl's
> implementation of void foo()?


Yes, but not B's. You're inheriting "doubly" from A. Based on the fact
that you're asking this question leads me to think that you probably
actually want virtual inheritance from A.




All times are GMT. The time now is 07:35 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.