Considérons le code suivant:C++ opérateur d'affectation résolution
struct A
{
void foo(const char *) { cout << __PRETTY_FUNCTION__ << endl; }
A & operator = (const A & ) { cout << __PRETTY_FUNCTION__ << endl; return * this; }
};
struct B : public A
{
void foo(const char *) { cout << __PRETTY_FUNCTION__ << endl; }
A & operator = (const A & other) { cout << __PRETTY_FUNCTION__ << endl; return * this; }
};
Puis, quand nous appelons ces membres:
B b;
b.foo("hehe");
b = b;
sera imprimé:
void B::foo(const char *)
A& A::operator=(const A&)
Question: pourquoi B :: foo cache A :: foo, mais B :: operator = non?
Ok, à ma connaissance, le compilateur génère le code suivant pour B: B & operator = (const B & b) {A :: operator = (b); return * this; } Mais si nous avons un "A :: operator =" virtuel, alors "B :: operator =" devrait être invoqué, car il écrase "A :: operator =". Mais ce n'est pas le cas. – drinian
la virtualité n'a pas d'importance ici. Une copie générée par le compilateur appelle toujours l'implémentation de la classe de base. Cela dit, avoir operator = virtual est rarement logique. Cf. http://icu-project.org/docs/papers/cpp_report/the_assignment_operator_revisited.html – Suma