2016-05-12 1 views
0

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!

+0

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

+0

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. –

Répondre

1

Selon les standards §8.4.2/p1 fonctions Explicitement défaillantes [dcl.fct.def.default] (Non souligné):

A function definition of the form:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default;

is called an explicitly-defaulted definition. A function that is explicitly defaulted shall

(1.1) — be a special member function,

(1.2) — have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const T”, where T is the name of the member function’s class) as if it had been implicitly declared, and

(1.3) — not have default arguments

fonction membre tst() n'est pas un special member function . Ainsi, il ne peut pas être par défaut. La spécification d'une fonction membre d'une classe (par exemple, class A) en tant que virtuel pur implique que toute classe qui hérite de cette classe et que vous ne voulez pas qu'elle soit abstraite doit également remplacer cette fonction membre.

+0

ok, la norme dit que ce type de comportement de sélection de la mise en œuvre par défaut de la classe de base pure n'est pas pris en charge, mais néanmoins on est curieux de savoir pourquoi il n'est pas –