A function overrides a virtual function of a base class based on the name and parameter types (see below). Therefore, your class C
has two virtual functions foo
, one inherited from each A
and B
. But a function void C::foo()
overrides both:
[class.virtual]/2
If a virtual member function vf
is declared in a class Base
and in a class Derived
, derived directly or indirectly from Base
, a member function vf
with the same name, parameter-type-list, cv-qualification, and ref-qualifier (or absence of same) as Base::vf
is declared, then Derived::vf
is also virtual (whether or not it is so declared) and it overrides Base::vf
.
As I already stated in the comments, [dcl.meaning]/1 forbids the use of a qualified-id in the declaration of a (member) function:
When the declarator-id is qualified, the declaration shall refer to a previously declared member of the class or namespace to which the qualifier refers [...]"
Therefore any virtual void X::foo();
is illegal as a declaration inside C
.
The code
class C : public A, public B
{
virtual void foo();
};
is the only way AFAIK to override foo
, and it will override both A::foo
and B::foo
. There is no way to have two different overrides for A::foo
and B::foo
with different behaviour other than by introducing another layer of inheritance:
#include <iostream>
struct A
{
virtual void foo() = 0;
};
struct B
{
virtual void foo() = 0;
};
struct CA : A
{
virtual void foo() { std::cout << "A" << std::endl; }
};
struct CB : B
{
virtual void foo() { std::cout << "B" << std::endl; }
};
struct C : CA, CB {};
int main() {
C c;
//c.foo(); // ambiguous
A& a = c;
a.foo();
B& b = c;
b.foo();
}
virtual void foo();
, and just once. – TruckleA
,B
andC
? There are many possibilities: example 1, example 2, ... (those probably define more functions than necessary) – Maltzmanvirtual void X::foo();
is illegal (as a declaration insideC
). – GoldarnC::A::foo
really meansA::foo
(thanks @DyP ). Here are simpler examples: ideone.com/HCYM1X and ideone.com/vdRp3X . – Maltzman