En Pourquoi n'y a-t-il pas de classe de base en C++ ? , J'ai cité Stroustrup sur les raisons pour lesquelles une classe d'objets commune à toutes les classes est problématique en C++. Dans cette citation il y a la déclaration :
L'utilisation d'une classe de base universelle implique un coût : Les objets doivent être alloués au tas pour être polymorphes ;
Je n'y ai pas vraiment regardé à deux fois, et comme son sur la page d'accueil de Bjarnes Je suppose que beaucoup d'yeux ont parcouru cette phrase et ont signalé toute inexactitude.
Un commentateur a toutefois fait remarquer que ce n'était probablement pas le cas et, rétrospectivement, je ne trouve aucune raison valable pour que ce soit le cas. Un court scénario de test donne le résultat attendu de VDerived::f()
.
struct VBase {
virtual void f() { std::cout <<"VBase::f()\n"; }
};
struct VDerived: VBase {
void f() { std::cout << "VDerived::f()\n"; }
};
void test(VBase& obj) {
obj.f();
}
int main() {
VDerived obj;
test(obj);
}
Bien sûr, si l'argument formel à tester était test(VBase obj)
le cas serait totalement différent, mais il ne s'agirait pas d'un argument pile vs. tas, mais plutôt d'une sémantique de copie.
Est-ce que Bjarne a tout faux ou est-ce que je rate quelque chose ?
0 votes
Il a été suggéré qu'il n'y a pas besoin d'une vtable dans cet exemple. Il est trivial d'ajouter une classe VDerived2, de construire dans main, d'appeler test, avec le résultat attendu comme suggéré par la question, donc une vtable doit être présente.
0 votes
Une conséquence amusante : vous n'avez pas écrit un destructeur virtuel, mais ici c'est parfaitement correct parce que ce n'est pas requis. Pourtant, la plupart des compilateurs (avec les avertissements activés) vous donneront un coup sur la tête...
0 votes
@Matthieu g++ -Wall(4.4.3) est poliment calme. Bien sûr, les destructeurs, virtuels ou non, n'ajouteraient rien à mon exemple et le code non pertinent est toujours, eh bien, non pertinent.
0 votes
C'est une excellente question sur une gaffe verbale très stupide de BS et sur la tendance des gens à supposer à tort qu'il ne peut pas faire de fautes d'expression. C'est une honte que la réponse acceptée (évidente) soit diluée par un tas de commentaires et de spéculations non pertinents ailleurs. Les pointeurs/références peuvent agir de manière polymorphe. Les objets individuels ne le peuvent pas. L'emplacement/la durée de stockage du ptr/ref ou de l'objet n'est absolument pas pertinent par rapport à ces faits évidents.