子类无法访问 C++ 公共(public)非虚拟基类方法

标签 c++ inheritance

鉴于下面代码段 1 和 2 中的两个类定义,您能否告诉我为什么我会收到第三个代码段中显示的编译错误以及如何修复它们?看起来子类无法访问基类中的非虚公共(public)方法(参见第二个代码片段中标记为第 197 行的子类中的方法 getVipAddress)。我是 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’

最佳答案

类的默认继承是私有(private)的。将您的声明更改为

class VipAddressSet : public BaseEntity

关于子类无法访问 C++ 公共(public)非虚拟基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024504/

相关文章:

javascript - 如何在 JavaScript 中继承私有(private)成员?

Javascript 扩展继承

java - 从子类获取数据: Java

c++ - 无法将 std::bind 的返回值转换为 void 函数指针

c++ - 使用 asio 的线程安全协程

c++ - 如何使用 Qt 5.1 获取歌曲的长度?

java - 使用继承不使用属性是正确的设计吗?导致序列化出现问题。 java

c++ - clang 给我警告标志更改,但是代码仍然会产生正确的输出

c++ - 用另一个函数替换 WndProc 来处理消息?

用于后期绑定(bind)错误的 C++ dynamic_cast - 切片