Avatar billede hessellund Nybegynder
18. marts 2002 - 09:34 Der er 14 kommentarer og
1 løsning

Simpelt nedarvnings spørgsmål

A og B er basis klasser.
C arver fra A
D arver fra A og B

Hvordan finder jeg runtime ud af om et objekt arver fra B eller ej?
Jeg bruger Borland C++ 3.1 og har så vidt jeg ved ikke dynamic_cast til rådighed.
Avatar billede chries Nybegynder
18. marts 2002 - 09:37 #1
Du implementer en char GetBaseClass(), som returner 0 for A og 1 for B.



class A
{
  const char base;

  A() : base(0)

}
Avatar billede chries Nybegynder
18. marts 2002 - 09:39 #2
arggg, kom til at truykker forkert

glemt det jeg har, så ikke lige du hvade multipel arv
Avatar billede chries Nybegynder
18. marts 2002 - 09:41 #3
geeee -> glemt det jeg har sagt, så ikke lige du havde multipel arv
eller forstår jeg det forkert ingen :-)

arver D både fra A og B eller kun enten fra A eller B ?
Avatar billede hessellund Nybegynder
18. marts 2002 - 09:44 #4
D arver fra både A og B problemet er at jeg har en array af objekter der kan være en blanding af C og D. Jeg mangler en måde at finde ud af om objektet arver fra B eller ej?
Avatar billede chries Nybegynder
18. marts 2002 - 09:52 #5
Avatar billede hessellund Nybegynder
18. marts 2002 - 09:56 #6
Tja du kan jo prøve at snakke med min chef på mine vegne om konvertering af de 500.000 linier kode vi har til 5.5 :-)
Avatar billede chries Nybegynder
18. marts 2002 - 10:01 #7
Du kunne lave den funktion, der fortæller om den er C eller D ? funktion virtuel i A og overloaded i C/D. Så kan du kalde den på A og så ved du om det er C/D og derved om den også har B?
Avatar billede hessellund Nybegynder
18. marts 2002 - 10:16 #8
Problemet i det er a jeg har omkring 40 klasser der nedarver fra A og/eller B. Jeg skal således skrive den samme kode et utal af gange og den næste programør der arbejder på systemet og laver en ny klasse får sikkert problemer med at forstå hvad der foregår. Jeg leder efter en metode hvor jeg kan implementere min kode i klasse A og B.... Tjaaa det er sikkert umuligt men man kan jo altid prøve.
Avatar billede chries Nybegynder
18. marts 2002 - 10:33 #9
okey, her noget gris, du lader A/B arve virtuelt fra T. i T implementer du en funktion der kan fortælle om en given base klasse exsisterer. A/B melder så ned til T (via contructor /funktion) at de eksisterer.
Avatar billede hessellund Nybegynder
18. marts 2002 - 10:57 #10
Problemet er at variabler i T så kommer til at eksistere to gange og det er ikke entydigt hvilken en jeg har fat i. Construktoren for T kører først. Jeg har lidt svært ved at gennemskue hvad der så sker hvordan dette skal implementeres. Jeg er en anelse forviret????
Avatar billede chries Nybegynder
18. marts 2002 - 11:00 #11
nej, den eksisterer kun 1 gang pr instans (pga den er virtuel)

det er diamand arve strukturen

  T
  /  \
A    B
  \  /
  D

  T
  / 
A   
  \ 
  C
Avatar billede chries Nybegynder
18. marts 2002 - 11:19 #12
her et c++ lavet i visual c++ 6

// TestMe.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"

class T
{
private:
    bool bA;
    bool bB;
public:
    T()
    {
        bA = false;
        bB = false;
    }

    bool isA()
    {
        return bA;
    }

    bool isB()
    {
        return bB;
    }

    void setA()
    {
        bA = true;
    }

    void setB()
    {
        bB = true;
    }
};

class A : virtual public T
{
public:
    A()
    {
        setA();
    }
};

class B : virtual public T
{
public:
    B()
    {
        setB();
    }
};

class C : public A
{
public:
    C()
    {
    }
};

class D : public A, public B
{
public:
    D()
    {
    }
};


int main(int argc, char* argv[])
{
    A *pA1 = new C();
    A *pA2 = new D();

    cout << "C:" << endl;
    if( pA1->isA() )
    {
        cout << " isA() == true" << endl;
    }
    else
    {
        cout << " isA() == false" << endl;
    }

    if( pA1->isB() )
    {
        cout << " isB() == true" << endl;
    }
    else
    {
        cout << " isB() == false" << endl;
    }


    cout << "D:" << endl;
    if( pA2->isA() )
    {
        cout << " isA() == true" << endl;
    }
    else
    {
        cout << " isA() == false" << endl;
    }

    if( pA2->isB() )
    {
        cout << " isB() == true" << endl;
    }
    else
    {
        cout << " isB() == false" << endl;
    }

    return 0;
}
Avatar billede chries Nybegynder
18. marts 2002 - 11:19 #13
C:
isA() == true
isB() == false
D:
isA() == true
isB() == true
Avatar billede hessellund Nybegynder
18. marts 2002 - 12:08 #14
Tusind tak for hjælpen det virker perfekt. Hvordan er det lige du får de 60 point??
Avatar billede chries Nybegynder
18. marts 2002 - 12:41 #15
:-)
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