2012-03-14 12 views
7

Jestem nowy w C++. Lubię odkrywać ideę dziedziczenia w C++. Ilekroć próbuję skompilować następujący kod pojawia się błąd:Jak zaimplementować dziedziczenie w C++ i rozwiązać błąd "klasa nadrzędna nie jest dostępną podstawą klasy podrzędnej"?

for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. 
D:\C Practice Files\Vehicle.cpp: In function `int main()': 
D:\C Practice Files\Vehicle.cpp:26: error: `void Vehicle::setStationary_state(bool)' is inaccessible 
D:\C Practice Files\Vehicle.cpp:141: error: within this context 
D:\C Practice Files\Vehicle.cpp:141: error: `Vehicle' is not an accessible base of `Ship' 

Execution terminated 

Oto mój kod:

#include <iostream.h> 
#include <conio.h> 
using std::string; 

class Vehicle{ 

      private:   
       bool stationary_state; 
       double max_speed; 
       double min_speed; 
       double weight; 
       double volume; 
       int expected_life; 
       string fuel_type; 
       string model; 
       string year_of_manufacture; 

      public:   
       Vehicle(){ 
       } 

       void setStationary_state(bool m){ 
         stationary_state = m;     
       } 

       bool getStationary_state(){ 
         return stationary_state;     
       }  
    }; 


    class Bike:Vehicle{ 
      private: 
       string bike_type; 

      public: 
       void setBike_Type(string t){ 
        type = t; 
       }  
       string getBike_Type(){ 
        return bike_type; 
       } 
    };  


    class Aircraft:Vehicle{ 
      private: 
      short no_of_wings; 

      public: 
      void setNo_of_wings(short wings) 
      { 

       no_of_wings = wings; 
      } 

      short getNo_of_wings() 
      { 
        return no_of_wings;  
      } 
      }; 



    class Car:Vehicle{ 

      private: 
      string reg_no; 
      string type; 

      public: 
      void setType(string t) 
      { 

       if ((t=="Pneumatic") || (t=="Hydraulic")) 
       { 
        type = t; 
       } 
       else 
       { 
        cout<<"\nInvalid entry. Please enter the correct type:"; 
        setType(t);   
       } 
      }  
      }; 




    class Ship:Vehicle{ 

      private: 
      bool has_radar_detection; 


      public: 
      void setRadar_Detection(bool r){ 

        has_radar_detection = r;           
      } 

      bool getRadar_Detection(){ 
        return has_radar_detection;         
      }  

      }; 


     int x; 
    main() 
    { 
     Vehicle v; 

     Bike b; 

     Car c; 

     Aircraft a; 

     Ship s; 

     s.setStationary_state(true); 

     c.setType("xyz"); 



     /*v.setStationary_state(true); 

     if (!(v.getStationary_state())) 
     { 
     cout<<"Vehicle is moving";       
     } 
     else 
     { 
     cout<<"Vehicle is at rest"; 
     }   
     */ 

     getch();  
    } 

Co tam jest naprawdę źle? Jaka jest przyczyna błędu i jak tego uniknąć. Proszę szczegółowo wyjaśnić.

+4

prawdopodobnie chcesz zrobić 'klasa Rower: public Vehicle' zamiast po prostu' klasy rowerów: Vehicle' –

+1

FYI: jesteś tym C nagłówki w C++, brakuje '#include ', klasy są domyślnym interesem prywatnym, więc 'class Class: BaseClass' jest prywatnym dziedziczeniem, i jest to' int main() '... – AJG85

+0

@ AJG85 Dziękuję za aktualizację mnie. –

Odpowiedz

15

class posiada prywatny domyślnego dziedziczenia, więc trzeba by określić public, tj

class Ship : public Vehicle { }: 

ans tak dalej. struct ma domyślnie dziedziczone dziedzictwo publiczne.

+0

Powiedzmy, czy ja lubię modyfikować powyższy kod, aby dowiedzieć się więcej o wirtualnych, przyjacielskich i chronionych słowach kluczowych. W jakich scenariuszach używamy tych słów kluczowych w celu zachowania powyższego przykładu kodu. –

+0

@Maxood Zacznę od wyszukania wirtualnego dziedziczenia, specyfikacji dostępu (publiczne, prywatne, chronione), metod wirtualnych i czystych metod wirtualnych. Po prostu jest zbyt wiele, aby wyjaśnić w komentarzu, ale istnieje wiele zasobów internetowych, a nawet stackoverflow pytania na wszystkie te tematy. Powodzenia! – juanchopanza

+0

Jeszcze raz dziękuję! Odtworzę ten sam kod z pewnymi zmianami i modyfikacjami w scenariuszu z nowym pytaniem. –

1

musisz określić dziedziczenia Poziom dostępu:

class Bike : public Vehicle 

Tj musisz wykonać Vehicle bazę public.

1

Jeśli nie określisz specyfikatora dostępu, dziedziczenie zostanie automatycznie zmienione na private. Musisz zmienić te linię:

class Ship:Vehicle 

do tego:

class Ship:public Vehicle 
+0

Czy "prywatne" oznacza, że ​​tylko prywatni członkowie są dziedziczeni? –

+0

Nie. Oznacza to, że wszyscy członkowie rodziny są prywatni dla klasy bazowej. – eduffy

+0

Masz na myśli, że wszyscy członkowie rodziny są prywatni (niewidzialni) w klasie dziecka? –

0

hermetyzacja jest osiągnięty poprzez umieszczenie powiązanych danych w tym samym miejscu i oferuje pełne bezpieczeństwo data.include

  1. private-access gwarantowanej do tej samej klasy
  2. public-any code może uzyskać dostęp do danych
  3. protected-access gwarancją metody tej samej klasy, przyjaciel klasy i klasy pochodnej
Powiązane problemy