Le code suivant précise dans la classe mère que l'operateur '=' doit être surchargé dans la classe fille. Or dès utilisation dans le main, il semblerait que l'aspect 'virtuel' de la surcharge ne fonctionne pas et qu'il cherche à appeller l'opérateur de la classe mère (non implémenté) plutôt que sa ré-écriture dans la classe fille !

Bref, je comprend vraiment pas là ou j'ai faux :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <cstdlib>
#include <cstdio>
#include <ctime>
 
class a {
  public:
    a();
    //virtual a& operator=(const a &ref) = 0;
    virtual a& set(const a &ref) = 0;
    void print() const;
  protected:
    int x;
};
 
class b : public a{
  public:
    //a& operator=(const a &ref);
    a& set(const a &ref);
};
 
a::a() {
  srand(time(NULL));
  x = rand();
}
void a::print() const {
  printf("x = %d\n", x);
}
 
/*
a& b::operator=(const a &ref) {
  x = dynamic_cast<const b*>(&ref)->x;
 
  return *this;
}
*/
a& b::set(const a &ref) {
  x = dynamic_cast<const b*>(&ref)->x;
 
  return *this;
}
 
int main() {
  b x, y;
 
  x.print();
  //y = x;
  y.set(x);
  y.print();
 
  return 0;
}
Message d'erreur lors de l'édition de liens :

main.o:main.cpp: (.text$_ZN1baSERKS_[b::operator=(b const&)]+0x14): undefined reference to `a::operator=(a const&)'
collect2: ld returned 1 exit status
Si j'utilise à la place de l'opérateur '=', la fonction 'set' la compilation passe bien.