Reputation: 54173
Say I have CFooer and it implements method void foo().
I then have ISomething that has virtual void foo() = 0.
I now create a class:
class CSuperFoo : public CBase, public CFooer, public ISomething
{
};
When I instance CSuperFoo, will I get a cannot instance abstract class error, or would this use CFooer's implementation to satisfy ISomething. If this does not work, why doesn't it?
Thanks
Upvotes: 3
Views: 179
Reputation: 208436
There are different cases to consider here. The first thing is what is the exact meaning of your sentence: CFooer implements method void foo(). If the meaning of that sentence is that there is a function with the same signature of the pure abstract function in ISomething
, then that is not implementing the function on the interface.
If CFooer
, on the other hand derives from ISomething
interface, then CFooer::foo
does implement the function and provides a final overrider. The problem is that because CSuperFoo
derives from both CFooer
and ISomething
, it contains two different subobjects of type ISomething
, and CFooer
is only providing a final-overrider for one of them, and CSuperFooer
is still abstract.
If that is the case, changing the inheritance both in CFooer
and CSuperFooer
from ISomething
to virtual will solve the issue (virtual inheritance is designed so that even if the type is mentioned in different levels or branches of the hierarchy tree, all of those that are marked as virtual
represent a single unique object. CSuperFooer
will have a single ISomething
subobject, and the final overrider can be that of CFooer
.
Upvotes: 0
Reputation: 992
As per the C++ FAQ this is "legal, but not moral".
http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.8
Essentially, you will "hide" the CFooer::foo() by implementing a virtual or non-virtual method with the same name foo in the derived class.
Upvotes: 0
Reputation: 7136
Short answer: No you cannot instantiate it.
Explanation: First you cannot instantiate a abstract class. An abstract class is a class that has a pure virtual function. You know that. Now any class that derives from this abstract class is still abstract until it implements those pure virtual functions. So if I SuperFoo inherits from ISomething, then until it implements the pure virtual functions declared in ISomething, SuperFoo will stay abstract. Now you may think that well, CFooer implements that pure virtual function declared in ISomething, and hence SuperFoo implements it. But if you think that then your forgetting something, namely function hiding, see, now SuperFoo definition of the pure virtual function gets hidden from the function prototype in ISomething, hence the pure virtual function needs to be defined. All of this assumes CFooer inherits from ISomething, since it has the same function definition and if not then your doing it wrong, actually you probably should even be in this situation.
One more thing to add is that if CFooer does inherit from ISomething, as it probably should, then there is no need for ISomething to be part of CSuperFoo. You can simply declare the defined function in CFooer as virtual and then again implement it in SuperFoo. There are also more problems that are possible depending on the minor detail of your code, such are the need for virtual inheritance.
Upvotes: 0
Reputation: 206596
You will have to provide an implementation in the Derived class CSuperFoo
to be able to create objects of it, otherwise it will be an Abstract class.
The method foo()
from the Base class ISomething
needs to be overridden in the deriving class CSuperFoo
explicitly because compiler cannot see any relation between method from class CFooer
and ISomething::foo()
as there is no relation between CFooer
& ISomething
, SO it demands the specific method being implemented in the derived class so that it is not an Abstract class anymore.
Does'nt work on Ideone.
Upvotes: 3
Reputation: 96291
If CFooer
virtually inherits from ISomething
I believe it should work ok (I didn't test it). If it doesn't inherit virtually then it will be treated as two distinct methods, and the abstract one will need to be overridden.
Typically in C++ one doesn't use inheritance to implement an interface though and see this code seems like a code smell at first glance. There might be a better, more C++ idiomatic approach if you gave us more details.
Upvotes: 3