L'opérateur d'assignation de l'héritage
Il y a ce code:
#include <iostream>
class Base {
public:
Base(){
std::cout << "Constructor base" << std::endl;
}
~Base(){
std::cout << "Destructor base" << std::endl;
}
Base& operator=(const Base& a){
std::cout << "Assignment base" << std::endl;
}
};
class Derived : public Base{
public:
};
int main ( int argc, char **argv ) {
Derived p;
Derived p2;
p2 = p;
return 0;
}
La sortie après la compilation par g++ 4.6:
Constructor base
Constructor base
Assignment base
Destructor base
Destructor base
Pourquoi opérateur d'affectation de la classe de base est appelé bien, il est dit que l'opérateur d'affectation n'est pas héréditaire?
double possible de des Problèmes avec l'héritage de l'opérateur= en C++
OriginalL'auteur scdmb | 2012-02-06
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas de défaut
dans votre
Derived
classe.Un opérateur d'affectation par défaut, cependant, est créé:
et cela demande de l'opérateur d'affectation de
Base
. Il n'est donc pas une question d'hériter de l'opérateur d'affectation, mais de l'appeler via le générées par défaut par l'opérateur dans votre classe dérivée."Il a juste été caché par implicitement créé opérateur= pour la classe Dérivée". Tout comme dans le cas de la classe de base a void func(int) et dérivée de la classe a void func(double), de la classe de base de la fonction void func(int) est caché. Sur les mêmes lignes de la classe de base de l'opérateur= est caché par classe dérivée de l'opérateur=.
...et pour être clair, depuis la base
operator=
n'a été caché, il peut être visible dans la classe dérivée avecusing Base::operator=;
et boom: il est héréditaire. Voir: stackoverflow.com/questions/4122214/...si elle n'est pas hérité de le rendre privé dans la classe de base et de voir le résultat
OriginalL'auteur Luchian Grigore
En fait, ce qui est appelé est implicitement défini
operator =
pourDerived
. La définition fournie par le compilateur appelle à son touroperator =
pour laBase
et de vous voir à la sortie correspondante. La même chose est avec le constructeur et le destructeur. Lorsque vous laissez le compilateur pour définiroperator =
, il se définit comme suit:où
Base1,...,Basen
sont les bases de la classe (dans l'ordre de les spécifier dans la liste d'héritage) etmember1, ..., membern
sont les membres de la Dérivée (sans compter les membres qui ont été héritées) dans l'ordre que vous avez déclaré dans la définition de la classe.OriginalL'auteur Armen Tsirunyan
Vous pouvez également utiliser "utiliser":
http://en.cppreference.com/w/cpp/language/using_declaration
J'ai lu ce post plusieurs fois avant que quelqu'un ne m'a aidé avec cela.
OriginalL'auteur Paul Thomas
Standard dit (12.8):
et puis la cession de l'opérateur de dérivée appelez votre base de
OriginalL'auteur Yola
C'est parce que l'affectation par défaut de l'opérateur créé l'appelle de base de l'opérateur d'affectation, c'est à dire qu'il n'est pas héréditaire, mais encore appelée dans le cadre de l'affectation par défaut de l'opérateur.
using Base::operator=;
serait de prouver cela en activant la base de la mise en œuvre et de la rendre disponible via la classe dérivée. Voir: stackoverflow.com/questions/4122214/...OriginalL'auteur Cpt. Red
Opérateur d'affectation est en effet pas hérité. Héritant que l'opérateur vous permet d'assigner un
Base
à unDerived
, cependantBase b; p = a;
sera (à juste titre) ne parviennent pas à compiler.Ce qui se passe est que le compilateur génère un
operator=
, puisque vous n'avez pas défini un programme personnalisé pourDerived
. L'générée automatiquementoperator=
va appeler les opérateurs d'affectation de l'ensemble de toutes les classes de base et de tous les membres. Dans cette perspective, il est à peu près le même que les constructeurs/destructeurs, qui a également appeler la fonction correspondante sur toutes les Bases/les membres de l'.using Base::operator=;
serait de prouver cela en activant la base de la mise en œuvre et de la rendre disponible via la classe dérivée. Voir: stackoverflow.com/questions/4122214/...OriginalL'auteur Grizzly