Comme @BenVoigt l'a souligné dans les commentaires, la réponse ci-dessous ne fonctionne qu'en raison d'un bogue dans g++ (ce qui signifie qu'il n'est pas garanti qu'elle continue à fonctionner, et elle n'est certainement pas portable). Ainsi, bien qu'elle puisse faire ce que vous voulez si vous utilisez un compilateur particulier (bogué), ce n'est pas une option que vous devriez utiliser.
Faites utiliser héritage virtuel cependant.
Ce n'est pas exactement le scénario que le code dans la question implique, mais la phrase
Ma question est la suivante : existe-t-il un moyen d'indiquer au compilateur que l'élément que l'implémentation de foo est celle de la classe B sans faire un appel appel explicite à B::foo() ?
semble demander une syntaxe permettant de distinguer plusieurs versions de base d'une fonction sans utiliser l'attribut ::
qualificatif.
Vous pouvez le faire avec le using
directive :
#include <iostream>
class A {
public:
A(){}
virtual void foo(){std::cout<<"A func";}
};
class B: virtual public A {
public:
B(){}
virtual void foo(){std::cout<<"B func";}
};
class C:virtual public A, virtual public B {
public:
C(){}
using A::foo; // tells the compiler which version to use
// could also say using B::foo, though this is unnecessary
};
int main() {
C c;
c.foo(); // prints "A func"
return 0;
}
Bien sûr, le code lui-même dans la question ne l'exige pas du tout, comme les autres réponses l'ont souligné.