Как реализовать наследование в C++ и устранить ошибку "родительский класс недоступен базе дочернего класса"?

Я новичок в C++. Мне нравится исследовать идею наследования в C++. Всякий раз, когда я пытаюсь скомпилировать следующий код, я получаю ошибку:

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

Execution terminated

вот мой код:

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

что там действительно не так? В чем причина ошибки и как ее избежать. Пожалуйста, объясните подробно.

4 ответов


class имеет частное наследование по умолчанию, поэтому вам нужно будет указать public, то есть

class Ship : public Vehicle { }:

и так далее. struct имеет публичное наследование по умолчанию.


необходимо указать уровень доступа к наследованию:

class Bike : public Vehicle

т. е. вам нужно сделать Vehicle a public базы.


Если вы не укажете спецификатор доступа, наследование будет автоматически private. Вам нужно изменить эти строки:

 class Ship:Vehicle

для этого:

 class Ship:public Vehicle

инкапсуляция достигается путем размещения связанных данных в одном месте и обеспечения безопасности data.include

  1. private-access гарантировано для того же класса
  2. public-any code может получить доступ к данным
  3. protected-access гарантируется методам одного и того же класса,класса friend и производного класса