By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,042 Members | 1,047 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,042 IT Pros & Developers. It's quick & easy.

Multiple ineritance question

P: n/a
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

Jul 19 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a

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

Jul 19 '05 #2

P: n/a

"Mattias B" <br****@ludd.luth.se> wrote in message
news:3f*********************@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.
Jul 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.