Προς το περιεχόμενο

Απορία σε κληρονομικότητα C++.


Αbominable

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω 2 κλάσεις

>
class A 
{
 int a;
 void f(void) {do_something_on_a;}
}

class B : public A
{
 int b;
 void f(void) {do_something_on_b;}
}

int main(void)
{
 B bO;
 bO.f();
 return 0;
}

Εάν τρέξω την B::f στην ουσία θα τρέξει την A::f (θα επεξεργαστεί το a). Εάν δηλώσω την A::f virtual τότε τρέχοντας την B::F θα τρέξει κανονικά (θα επεξεργαστεί το b ). Πως μπορώ να κάνω όταν καλώ την B::f να τρέξει και η B::F και η A::f (να επεξεργαστούν και το a και το b ); Αυτό που ζητάω γίνεται;

 

Ευχαριστώ πολύ για όποια βοήθεια.

Δημοσ.
>

class Foo
{
public:
void Bar()
{
	std::cout<<"Foo::Bar\n";
}
};
class Fee
: public Foo
{
public:
void Bar()
{
	std::cout<<"Fee::Bar\n";
	Foo::Bar();
}
};
int main(int,char**)
{
Fee fee;
fee.Bar();
return 0;}

Δημοσ.

Έχω 2 κλάσεις

>
class A 
{
 int a;
 void f(void) {do_something_on_a;}
}

class B : public A
{
 int b;
 void f(void) {do_something_on_b;}
}

int main(void)
{
 B bO;
 bO.f();
 return 0;
}

Εάν τρέξω την B::f στην ουσία θα τρέξει την A::f (θα επεξεργαστεί το a). Εάν δηλώσω την A::f virtual τότε τρέχοντας την B::F θα τρέξει κανονικά (θα επεξεργαστεί το b ). Πως μπορώ να κάνω όταν καλώ την B::f να τρέξει και η B::F και η A::f (να επεξεργαστούν και το a και το b ); Αυτό που ζητάω γίνεται;

 

Ευχαριστώ πολύ για όποια βοήθεια.

 

Αυτό είναι λάθος. Αν καλείς την f χρησιμοποιώντας object της Β τότε θα κληθεί η Β::f. Aν καλείς την συνάρτηση χρησιμοποιώντας pointer σε object της Β τότε εξαρτάται από την κλάσση του pointer κι αν η f είναι virtual ή όχι.

 

>
#include <iostream>

class A
{
public:
  void DoSomething()
  {
     std::cout << "I'm A \n";
  }
};

class B : public A
{
public:
  void DoSomething()
  {
     std::cout << "I'm B \n";
  }
};

int main(int argc, char **argv)
{
  B b;
  b.DoSomething( );

  return 0;
}

Σ'αυτή την περίπτωση θα εμφανιστεί "I'm B".

 

 

 

>
#include <iostream>

int main(int argc, char **argv)
{
  B b;
  B *pb = &b;

  pb->DoSomething( );

  return 0;
}

Εδώ πάλι θα εμφανιστεί "I'm B".

 

 

 

>
#include <iostream>

int main(int argc, char **argv)
{
  B b;
  A *pa = &b;

  pa->DoSomething( );

  return 0;
}

Eδώ τώρα επειδή η DoSomething δεν είναι virtual θα εμφανιστεί "I'm A".
Άμα δηλώσεις όμως την A σαν virtual τότε θα κληθεί πάλι η B::DoSomething( ).

 

 

Όσο για την ερώτηση που έκανες σε κάλυψε σωστότατα ο παπί.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...