Avatar billede antialize Nybegynder
30. november 2002 - 21:03 Der er 4 kommentarer og
1 løsning

Variabel nedarvning

Er det muligt at nedarve en variable i c++ på samme måde som owerride i pascal: Således at følgende passer:

class CChildBace;

class CParentBace {
  CChildBace * pClild;
}

class CChildBace {
  Create( CParentBace * owner ) {
    owner->pChild = this
  }
}

class CChild;

class CParent: public CParentBace {
  CChild * pClild;
}

class CChild : public CChildBace {
  char * szName;
  CChild( CParent * owner , char * name ) {
    Create( owner );
    szName = name;
  }
}

CParent * p = new CParent;
CChild * c = new CChild( p , "Fisk" );

nu ville det være rart hvis p->pChild->szName er "Fisk"..
Men det er det ikke da pointeren pChild ikke er en pointer men 2. p->pChild er ikke det samme som ((CParentBace*)p)->pChild. I pascal kunne man ordne dette med key wordet owerride foran pChild, men hvad med c++??
Avatar billede arne_v Ekspert
30. november 2002 - 21:35 #1
Følgende lettere omskrivning af din kode dør med
en null pointer:

#include <iostream>

using namespace std;

class CChildBase;

class CParentBase {
public:
  CChildBase *pChild;
};

class CChildBase {
public:
  void Create( CParentBase *owner ) {
    owner->pChild = this;
  }
};

class CChild;

class CParent : public CParentBase {
public:
  CChild *pChild;
};

class CChild : public CChildBase {
public:
  char *szName;
  CChild( CParent *owner , char * name ) {
    Create( owner );
    szName = name;
  }
};

int main() {
  CParent *p = new CParent;
  CChild *c = new CChild( p , "Fisk" );
  cout << p->pChild->szName << endl;
}

Følgende er ikke særligt objektorienteret men virker:

#include <iostream>

using namespace std;

class CChildBase;

class CParentBase {
public:
  CChildBase *pChild;
};

class CChildBase {
public:
  void Create( CParentBase *owner ) {
    owner->pChild = this;
  }
};

class CChild;

class CParent : public CParentBase {
public:
  CChild *pChild;
};

class CChild : public CChildBase {
public:
  char *szName;
  void Create( CParent *owner ) {
    owner->pChild = this;
  }
  CChild( CParent *owner , char * name ) {
    Create( owner );
    szName = name;
  }
};

int main() {
  CParent *p = new CParent;
  CChild *c = new CChild( p , "Fisk" );
  cout << p->pChild->szName << endl;
}

Følgende er nok en mere køn løsning:
#include <iostream>

using namespace std;

class CChildBase;

class CParentBase {
public:
  CChildBase *pChild;
};

class CChildBase {
public:
  void Create( CParentBase *owner ) {
    owner->pChild = this;
  }
};

class CChild;

class CParent : public CParentBase {
};

class CChild : public CChildBase {
public:
  char *szName;
  CChild( CParent *owner , char * name ) {
    Create( owner );
    szName = name;
  }
};

int main() {
  CParent *p = new CParent;
  CChild *c = new CChild( p , "Fisk" );
  cout << ((CChild *)p->pChild)->szName << endl;
}
Avatar billede antialize Nybegynder
01. december 2002 - 13:43 #2
Det er lige nettop det jeg gerne vil undvære...
Jeg vil gerne lave en genereic Class til Pointer Arrayes UDEN at skulle til at type caste hele tiden..
Avatar billede antialize Nybegynder
01. december 2002 - 13:44 #3
Men det kan man nok ikke kan man????
Avatar billede arne_v Ekspert
01. december 2002 - 13:49 #4
Efter min bedste overbevisning: nej.

Det du i virkeligheden ønsker er at kunne lave en
member virtual. Og det kan man ikke i C++ (kun methods).
Avatar billede antialize Nybegynder
01. december 2002 - 17:04 #5
Det tænkte jeg nok..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester