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++??
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;
}
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..
01. december 2002 - 13:44
#3
Men det kan man nok ikke kan man????
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).
01. december 2002 - 17:04
#5
Det tænkte jeg nok..
Kurser inden for grundlæggende programmering