Je suis curieux de savoir pourquoi, en C++ 11, l'utilisation de "= default" sur une méthode virtuelle dérivée ne sélectionne pas l'implémentation pure de la classe de base. Par exemple, le code de test suivant produit le message "error: 'virtual void B :: tst()' ne peut pas être défini par défaut" à partir de "g ++ -std = C++ 11".C++ 11 = mot-clé par défaut sur la fonction virtuelle pour spécifier l'implémentation pure par défaut
struct A {
virtual ~A() = default;
virtual void tst() = 0;
};
void A :: tst() {}
struct B : public A {
virtual void tst() = default;
};
Nous pouvons bien sûr fournir un B :: TST qui appelle la mise en œuvre de base par défaut, mais on craint que cela pourrait être la mise en œuvre frais généraux plus élevé par rapport à un hypothétique « = défaut » codage en fonction.
Désolé de poser des questions sur ce qui pourrait ou ne pas être dans l'esprit des personnes du comité de normalisation C++, mais néanmoins peut-être quelqu'un ici au débordement de pile aura une certaine sagesse concernant l'impossibilité d'utiliser le mot-clé par défaut. être intéressant à entendre.
Merci!
Par défaut, une classe enfant partage l'implémentation du parent sans rien écrire, en supposant que l'enfant hérite du parent de manière non privée. Donc, dans ce contexte, qu'essayez-vous d'avoir '= default'? – md5i
Lorsque la fonction virtuelle est pure, nous exigeons que la classe dérivée choisisse une implémentation. La classe dérivée peut fournir une implémentation ou choisir d'appeler une implémentation par défaut dans la base. Cependant, la valeur par défaut pourrait potentiellement permettre à la dérivée de spécifier la base par défaut simplement chargée dans le vtable par le compilateur, ce qui serait potentiellement plus efficace que l'envoi vers une implémentation dérivée qui retourne et rappelle l'implémentation de base par défaut. Je considère cependant que c'est un choix de conception important pour faire en sorte que la classe dérivée choisisse au moment de la compilation. –