Multiple ineritance question

M

Mattias B

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
 
A

Andrey Tarasevich

Mattias said:
...
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.
 
J

jeffc

Mattias B said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top