2013-02-22 6 views
0

Учитывая два определения класса в фрагментах 1 и 2 ниже, можете ли вы рассказать мне, почему я получаю ошибки компиляции, показанные в третьем фрагменте, и как я могу исправить их? Похоже, что подкласс не может получить доступ к не виртуальным общедоступным методам в базовом классе (см. Метод getVipAddress в подклассе, помеченном как строка 197 во втором фрагменте кода). Я новичок в области C++, поэтому я ценю, если вам понадобятся другие улучшения, необходимые для блоков кода.Открытый метод не виртуального базового класса C++ недоступен из подкласса

SNIPPET 1 (базовый и суб-класс)

// базовый класс

class BaseEntity 
{ 
public: 
BaseEntity(): mUUID(""), mName("") {} 
BaseEntity(std::string &uuid, std::string &name): mUUID(uuid), mName(name) { } 

BaseEntity (const BaseEntity &copyin) 
{ 
    this->mUUID = copyin.mUUID.c_str(); 
    this->mName = copyin.mName.c_str(); 
} 

BaseEntity operator = (const BaseEntity &rhs) 
{ 
    this->mUUID = rhs.mUUID.c_str(); 
    this->mName = rhs.mName.c_str(); 

    return *this; 
} 

~BaseEntity() { }; 

void setUUID(std::string uuid) { mUUID = uuid; } 
void setName(std::string name) { mName = name; } 

       /*LINE 89 is the following*/ 
const std::string &getUUID() const { return mUUID; } 
const std::string &getName() const { return mName; } 

    private: 
std::string mUUID; 
std::string mName; 

}; 

// ПОДКЛАСС

class VipAddressSet : BaseEntity 
{ 
    public: 
    VipAddressSet() : BaseEntity() { } 
    VipAddressSet(std::string &uuid, std::string &name) : BaseEntity(uuid, name) { } 

    VipAddressSet(const VipAddressSet &copyin) 
    { 
      setUUID(copyin.getUUID()); 
      setName(copyin.getName()); 

       std::vector<VipAddressEntity>::const_iterator iter; 
      for(iter = copyin.mVipAddressList.begin(); iter != copyin.mVipAddressList.end(); iter++) 
      { 

       addVipAddress(*iter); 
      } 
    } 

    VipAddressSet operator = (const VipAddressSet &rhs) 
    { 
      setUUID(rhs.getUUID()); 
      setName(rhs.getName()); 

       std::vector<VipAddressEntity>::const_iterator iter; 
      for(iter = rhs.mVipAddressList.begin(); iter != rhs.mVipAddressList.end(); iter++) 
       { 
      addVipAddress(*iter); 
      } 

      return *this; 
     } 

    int getVipAddress(std::string &uuid, VipAddressEntity **ptr) 
    { 
     std::vector<VipAddressEntity>::const_iterator iter; 
     for(iter = mVipAddressList.begin(); iter != mVipAddressList.end(); iter++) 
     { 
    **/*~~~~ LINE 197 is the following ~~~~*/** 
      if(iter->getUUID() == uuid) 
      { 
       **ptr = *iter; 
       return 1; 
      } 
     } 

     return 0; 
    } 


    const std::vector<VipAddressEntity>& getVipAddressList() const { return mVipAddressList; } 


    private: 
     std::vector<VipAddressEntity> mVipAddressList; 

     void addVipAddress(const VipAddressEntity &entity) 
     { 
     mVipAddressList.push_back(entity); 
     } 

    }; 

КОМПИЛЯЦИЯ ВЫВОД

$ g++ -g -c -std=c++11 -Wall Entity.hpp 
    Entity.hpp: In member function ‘int ECLBCP::VipAddressSet::getVipAddress(std::string&, ECLBCP::VipAddressEntity**)’: 
    Entity.hpp:89:21: error: ‘const string& ECLBCP::BaseEntity::getUUID() const’ is inaccessible 
    Entity.hpp:197:24: error: within this context 
    Entity.hpp:197:24: error: ‘ECLBCP::BaseEntity’ is not an accessible base of ‘const ECLBCP::VipAddressEntity’ 

ответ

3

Наследование по умолчанию для класса является приватным. Изменить объявление в

class VipAddressSet : public BaseEntity 
1

Это потому, что вы должны наследует его с открытым модификатором

class VipAddressSet : public BaseEntity 
1

Я думаю, вы наследуя с private. Попробуйте

class VipAddressSet : public BaseEntity 

иначе метод не будет виден.

Смежные вопросы