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