Étant donné le code suivant
class T {
public:
virtual ~T () {}
virtual void foo () = 0;
};
class U {
public:
U() {}
~U() {}
void bar () { std::cout << "bar" << std::endl; }
};
class A : public U, public T {
public:
void foo () { std::cout << "foo" << std::endl; }
};
int main () {
A * a = new A;
std::vector<U*> u;
std::vector<T*> t;
u.push_back(a);
t.push_back(reinterpret_cast<T*>(u[0]));
u[0]->bar ();
t[0]->foo ();
delete a;
return 0;
}
J'obtiens le résultat escompté
bar
foo
Toutefois, si je modifie la définition de U
a
class U {
public:
U() {}
virtual ~U() {}
virtual void bar () { std::cout << "bar" << std::endl; }
};
Je compile toujours correctement et sans avertissements/erreurs, mais la sortie est maintenant la suivante
bar
bar
Qu'est-ce qui, dans la déclaration virtuelle, m'empêche de faire appel à la fonction foo
?