Polimorfizm, dziwna sytuacja

Polimorfizm, dziwna sytuacja
MI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 243
0
Kopiuj
 #include <iostream>

using namespace std;

class vehicle
{
public:
    virtual void show()
    {
        cout << "aaaa" << endl;
        show();
    }
};

class car:public vehicle
{
public:
    void show()
    {
        cout << "bbb" << endl;
    }
};

int main()
{
    vehicle *ptr;
    car autko;
    ptr=&autko;
    ptr->vehicle::show();
    return 0;
}

Dlaczego przy takim wywołaniu funkcji show uruchamia się zarówno funkcja z klasy bazowej jak i pochodnej?

szweszwe
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1694
2

Bo tak napisałeś funkcję. Wywołanie show() z klasy bazowej (a to właśnie robisz) powoduje wypisanie "aaaa" i kolejne wywołanie funckji show().

  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
ptr->vehicle::show();<\code>
Taki zapis oznacza że `vehicle::show` to tzw. `qualified-id`, natomiast samo `vehicle::` to `nested-name-specifier`. Semantyka jest banalna, wywołujesz explicit metodę `show` z klasy `vehicle`. Metodę tę wołasz na pointerze wskazującym na klasę pochodną `car`, zatem w środku metody `show` z klasy bazowej wołasz już metodę z klasy `car`.
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
3

Wydaje mi się że to chciałeś osiągnąć:

Kopiuj
#include <iostream> 
using namespace std;
 
class vehicle
  {
   public:
   virtual void show() { cout<<"aaaa"<<endl; }
  };
 
class car:public vehicle
  {
   public:
   virtual void show()
     {
      vehicle::show();
      cout<<"bbb"<<endl;
     }
  };
 
int main()
  {
   vehicle *ptr;
   car autko;
   ptr=&autko;
   ptr->vehicle::show();
   return 0;
 }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.