[c++] inheritance en operators

Pagina: 1
Acties:

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Ik heb een prachtige object hierarchie gebouwd, waarin ik een operator heb gedefinieerd. (in het voorbeeld de operator =).
Hoe kan ik nu de parent aanroepen (die een ANDERE parametertype heeft...)
code:
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
class Parent
{
public:
  Parent();

  const Parent& operator=(const Parent &right);
};

class Child
{
public:
  Child();

  const Child& operator=(const Child &right);
};

Parent::Parent() 
{
  cout << "Parent constructed" << endl;
}

Child::Child() 
  :
  Parent();
{
  cout << "Childconstructed" << endl;
}

const Parent& Parent::operator=(const Parent &right)
{
  cout << "Parent operator..." << endl;
}

const Child & Child::operator=(const Child &right)
{
  // eerst parent aanroepen. right als Parent...
  // de code zou zijn:
  //   *object = *right
  // maar dan roept 'ie deze procedure aan...
  
  cout << "Child operator..." << endl;
}

Localhost, sweet localhost


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
ligt er toch aan was het type van object is?
code:
1
2
Parent * right;
Parent * object = right;

zo wordt Parent::operator= aangeroepen
code:
1
2
Child * right;
Child * object = right;

nu wordt Child::operator= aangeroepen

ik zie trouwens nergens inheritance :?

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct s
{
    void operator= (s &)
    {
        cout << "s::operator=\n";
    }
};

struct t : s
{
    void operator= (t & other)
    {
        s::operator= (other);
        cout << "t::operator=\n";
    }
};

Is dit ongeveer wat je zoekt ? :?

edit: Als je (in dit voorbeeld) t::operator= alleen maar gebruikt om s::operator= aan te roepen, kan je em ook gewoon weglaten. Inheritance betekent: t 'is-een' s, en de s base classes worden gewoon gekopieerd by default.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Zo te zien snap je niet helemaal wat de bedoeling is..

In de operator= van je child object gebruik je de = operator op twee Child objecten. Dus roept ie operator= aan van het Child object. En zowaar je hebt een oneindige recursie.

Ten eerste het definieren van je operator= heb je al gedaan in je Parent klasse.
Ten tweede, wat is het nu van het overloaden van een simpele pointer toekenning? Dat kun je ook simpel op pointer nivo doen.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Sorry.. de inheritance ben ik vergeten in te tikken. De bovenstaande code is een mooi schoon voorbeeld, in werkelijkheid heten de objecten anders... en gebeurt er best wat meer. Het belangrijkste wat er moet gebeuren is dat als dit wordt aangeroepen:

child e;
child f;

*e = *f;

Dat de fields van e worden gedelete'd, en dat e een kopie wordt van f.
Er vind dus wat gekopieer plaats. en iedere klasse moet natuurlijk zichzelf kopieeren. Nu bestaat child uit twee klassen (child en parent) en moet er dus nog iets aangeroepen worden.

maar in ieder geval bedankt... Het volgende bleek te werken
code:
1
2
3
   Parent *e;
   e = this;
   *e = right;

edit:

btw. sorry voor mijn matige communicatie. Mijn vaagheid neemt sterk toe na 23:00 en begint weer af te nemen rond 1:00, mits ik ga slapen.

Localhost, sweet localhost


Verwijderd

DDD>> er komt geen recursie, je gebruikt de assignment operator van de parent om alle members van de parent class te assignen, en vervolgens assign je de child members.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Parent {
private:
  int _patentvar;

public:
  Parent& operator = (const Parent& p)
    { _parentvar= p._parentvar;
    return *this;
    }
};

class Child : public Parent {
private:
  int _childvar;

public:
  Child& operator = (const Child& c)
    { Parent::operator = (c); // asign _parentvar,
                    // behandelt c als een Parent
    _childvar= c._childvar;
    return *this;
    }
};

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ik heb het natuurlijk over het eerste voorbeeld vankvdmeer.

Verwijderd

Op maandag 05 november 2001 23:49 schreef The - DDD het volgende:
Ik heb het natuurlijk over het eerste voorbeeld vankvdmeer.
Ow :+ Maarja, dan nog. ik denk dat het direct aanroepen van de parent methode (zoals Sneech en ik voorstellen) toch duidelijker is dan dat gegoochel met pointers en/of reinterpret_cast<>()'s.
Pagina: 1