| 12
 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
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 
 | class IFirstInterface
{
public:
  virtual int A() = 0;
  virtual int B() = 0;
};
 
class ISecondInterface
{
public:
  virtual int C() = 0;
  virtual int D() = 0;
};
 
class CFirstImpl: public IFirstInterface
{
public:
  int A() {return -1;}
};
 
class CFirstImplPhase2: public CFirstImpl
{
public:
  int B() {return -22;}
};
 
class CSecondImpl: public CFirstImplPhase2, public ISecondInterface
{
public:
  int C() {return -333;}
  int D() {return -4444;}
};
 
class TFirstImpl: public TObject, public IFirstInterface
{
public:
  int A() {return -1;}
};
 
class TFirstImplPhase2: public TFirstImpl
{
public:
  int B() {return -22;}
};
 
class TSecondImpl: public TFirstImplPhase2, public ISecondInterface
{
public:
  int C() {return -333;}
  int D() {return -4444;}
};
 
class TSecondBisImpl: public IFirstInterface, public ISecondInterface
{
public:
  int A() {return -1;}
  int B() {return -22;}
  int C() {return -333;}
  int D() {return -4444;}
};
 
 
 
//---------------------------------------------------------------------------
void __fastcall TLanguageBasicsForm::BtnInterfaceSeparateImplementsClick(TObject *Sender)
{
  IFirstInterface* ObjC = new CFirstImplPhase2();
  OutputDebugString(Format("A : %d - B : %d", ARRAYOFCONST((ObjC->A(), ObjC->B()))).c_str());
  delete ObjC;
 
  IFirstInterface* ObjVCL = new TFirstImplPhase2();
  OutputDebugString(Format("A : %d", ARRAYOFCONST((ObjVCL->A()))).c_str());
  // B() plantera : Pure virtual function called
  // Le programme sera probablement totalement dans les choux (CTRL + F2 pour quitter)
  // OutputDebugString(Format("B : %d", ARRAYOFCONST((ObjVCL->B()))).c_str());
  delete (TFirstImplPhase2*)ObjVCL;
 
  CSecondImpl* ObjC2 = new CSecondImpl();
  IFirstInterface* IC = ObjC2;
  ISecondInterface* IC2 = ObjC2;
  OutputDebugString(Format("A : %d - B : %d - C : %d - D : %d", ARRAYOFCONST((IC->A(), IC->B(), IC2->C(), IC2->D()))).c_str());
  delete ObjC2;
 
  TSecondImpl* ObjVCL2 = new TSecondImpl();
  IFirstInterface* IVCL = ObjVCL2;
  ISecondInterface* IVCL2 = ObjVCL2;
  OutputDebugString(Format("A : %d", ARRAYOFCONST((IVCL->A()))).c_str());
  // OutputDebugString(Format("B : %d", ARRAYOFCONST((IVCL->B()))).c_str());
  OutputDebugString(Format("C : %d", ARRAYOFCONST((IVCL2->C()))).c_str());
  OutputDebugString(Format("D : %d", ARRAYOFCONST((IVCL2->D()))).c_str());
  delete ObjVCL2;
 
  TSecondBisImpl* ObjBis = new TSecondBisImpl();
  IFirstInterface* IBis = ObjBis;
  ISecondInterface* IBis2 = ObjBis;
  OutputDebugString(Format("A : %d - B : %d - C : %d - D : %d", ARRAYOFCONST((IBis->A(), IBis->B(), IBis2->C(), IBis2->D()))).c_str());
  delete ObjBis;
 
}
//--------------------------------------------------------------------------- | 
Partager