Polimorfizm, dziwna sytuacja

0
 #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?

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().

2

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`.
3

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

#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;
 }

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0