Как реализовать наследование в C ++ и устранить ошибку «родительский класс не является доступной базой дочернего класса»? - PullRequest
7 голосов
/ 15 марта 2012

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

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

Вот мой код:

 #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 ]

16 голосов
/ 15 марта 2012

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

class Ship : public Vehicle { }:

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

1 голос
/ 15 марта 2012

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

 class Ship:Vehicle

к этому:

 class Ship:public Vehicle
1 голос
/ 15 марта 2012

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

class Bike : public Vehicle

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

0 голосов
/ 21 мая 2013
Инкапсуляция

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

  1. private - доступ предоставлен к тому же классу
  2. public - любой код может получить доступ к данным
  3. protected - доступ предоставлен методам того же класса, класса друга и производного класса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...