Ошибка при попытке включить содержимое одного класса в другой

Я еще зеленый новичок, поэтому за ошибки прошу ногами не бить)
Имеется следующий код:

#include <iostream>
#include <Windows.h>
#include<string>
using namespace std;    

class State
{
public:
    //...          
    void GetInfoAboutState(){//...}    
};   

class Society  //  общество
{
//...
public:
    void GetInfoAboutSociety()
    { //...   }        
};

class Primitive_Society : Society // Так выглядит наследование
{
//...

public:
   //...        
    void GetInfoAboutPrimitiveSociety()
    {
        GetInfoAboutSociety();
        //...
    }
    //...
};


class Slave_Owning_Society : Primitive_Society
{
protected:
    //...    
public:
//...     
    void GetInfoAbouSlaveOwningSociety()
    {
        GetInfoAboutPrimitiveSociety();
        //...  
    }       
};    

class Feudal_Society : Slave_Owning_Society
{
protected:
   //...    
public:     
    //...
    void GetInfoAboutFeudalSociety()
    {
        GetInfoAbouSlaveOwningSociety();
        GetInfoaboutState();
    }
};     

Задачка такая: нужно в классе Feudal_Society сделать вывод государств (класс State)/ Сделал класс State, не могу через функцию GetInfoaboutState получить нужную информацию.

Компилятор выдает ошибки:

C3861 GetInfoaboutState: идентификатор не найден E0020 идентификатор "GetInfoaboutState" не определен

Что я делаю не так?


Ответы (1 шт):

Автор решения: AR Hovsepyan

Закрытое наследование подразумевает, что наследник может использовать все открытые и защищенные члены базового класса, но он не имеет этих членов.

только class Primitive_Society и его друзья могут использовать функции члены закрытого базового класса. В данном случаи Society::GetInfoAboutSociety, поэтому:

void GetInfoAboutPrimitiveSociety()
{
    GetInfoAboutSociety();
    //...
}

правильная реализация. Но class Slave_Owning_Society : Primitive_Society, и class Feudal_Society : Slave_Owning_Society никак не могут использовать функции_члены закрытого базового класса своих закрытых базовых классов. В частности, Society::GetInfoAboutSociety для них не доступна(закрытый интерфейс).

Обратите внимание на:

  • нужно классу просто иметь базу для использования или он должен быть разновидностью базового класса
  • качество кода и количество кода для оформления вопроса

Обновление:

Так как Primitive_Society по идее является разновидностью Society, то нужно это выразить кодом именно так, то есть наследование делать открытым:

class Primitive_Society : public Society 

тогда класс будет иметь свою собственную GetInfoAboutState и другие члены, унаследованные от базового класса, и проблема отпадет.

→ Ссылка