【问题标题】:Inheriting private members from base class to derived classes c++从基类继承私有成员到派生类c ++
【发布时间】:2025-11-20 13:40:03
【问题描述】:

我正在尝试将名称、skeletonType 和 numLegs 从我的基类继承到派生类。 我有一个名为 Invertebrates 的基类和一个名为 Spider 的派生类。我希望能够将私有变量与我的基类的派生类一起使用。我在第 47 行不断收到编译错误,它在 ',' 之前显示预期的主表达式。

我试图让我的输出看起来像这样:

Spider:Brown Recluse, number of legs = 8, skeleton type = EXOSKELETON

请有人帮助我并指出正确的方向。这是我到目前为止汇总的内容。

// invertebrates.h
// invertebrate specifications

#ifndef _INVERTEBRATE_H_
#define _INVERTEBRATE_H_

#include <iostream>

using namespace std;

enum Skeleton_Type { NONE, HYDROSTATIC, EXOSKELETON };

class Invertebrate {
  private:
    string name;
    Skeleton_Type skeletonType;
    int numLegs;
  protected:
    void setSkeletonType(Skeleton_Type skeletonType);
    void setNumLegs(int numLegs);
  public:
    Invertebrate();
    Invertebrate(string name, Skeleton_Type skeletonType, int numLegs);
    string getName();
    Skeleton_Type getSkeletonType();
    int getNumLegs();
    virtual void print() = 0;
};

class Spider : public Invertebrate {
  private:
    const string NAME_PREFIX = "Spider: ";
  public:
    Spider();
    Spider(string name);
    virtual void print();
};
#endif // _INVERTEBRATE_H_ 
**********************************************************************

//invertebrates.cpp

#include "invertebrate.h"

void Invertebrate::setSkeletonType(Skeleton_Type skeletonType)
{
     this->skeletonType = skeletonType;
}

void Invertebrate::setNumLegs(int numLegs)
{
    this->numLegs = numLegs;
}
Invertebrate::Invertebrate()
{
    name = "noName";
    skeletonType = NONE;
    numLegs = 0;
}

Invertebrate::Invertebrate(string name, Skeleton_Type skeletonType, int     numLegs)
{
    this->name = name;
    this->skeletonType = skeletonType;
    this->numLegs = numLegs;
}

string Invertebrate::getName()
{
    return this->name;
}

Skeleton_Type Invertebrate::getSkeletonType()
{
    return this->skeletonType;
}

int Invertebrate::getNumLegs()
{
    return this->numLegs;
}


Spider::Spider(string name):Invertebrate(name,EXOSKELETON,8)
{
    name =   Invertebrate::getName();
}



void Spider::print()
{
    string strSkType = "";
    if(this->getSkeletonType() == 0)
          strSkType= "none";
    else if(this->getSkeletonType() == 1)
          strSkType= "Hydrostatic";
    else if(this->getSkeletonType() == 2)
          strSkType= "exoskeleton";

    cout << this->NAME_PREFIX + getName();
    cout << ", number of legs = " << this->getNumLegs() << ", skeleton type = " << strSkType << endl;
 }


int main()
{
    Spider *sp = new Spider("Brown Recluse");
    sp->print();

    return 0;
}

OUTPUT:

【问题讨论】:

  • 到底是什么问题!?你没有提到它,也没有展示它。
  • 看起来不错,您能详细说明您的问题吗?
  • 您可以简单地添加一些protected 访问器函数。或者,如果值没有不变量或其他约束,只需将成员变量设为protected
  • 我不太了解如何实现这一点。我一直在阅读和研究它,但还没有得到它。编译代码时不断出现错误。我无法让它打印我想要打印的内容。就在这里 = Spider:Brown Recluse,腿数 = 8,骨架类型 = EXOSKELETON
  • 当你说你得到一个错误时,你真的应该说你得到了什么错误......

标签: c++ class inheritance derived-class base-class


【解决方案1】:

以下是代码中的问题:-

  1. 在 .h 文件中 -

const string NAME_PREFIX = "蜘蛛:";

不是初始化 cont 成员的有效方法 - 应通过构造函数初始化器列表初始化 const(直到 C++11)。

.cpp 中的正确方式

Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
{
    name = NAME_PREFIX + Invertebrate::getName();
}
  1. 在同一个构造函数中你写了name&,这是错误的,只传递name。

蜘蛛::蜘蛛(字符串 name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)

【讨论】:

  • 感谢大家帮助我。这似乎是这里的问题。我的老师设置了头文件并告诉我们使主要功能工作,我已经工作了几天了。我什至不知道您可以在基类中包含更多变量。
  • const string NAME_PREFIX = "Spider: "; 是自 C++11 以来的有效语法。
  • @n.m.yeah 你是对的,我忘了说..编辑的答案
【解决方案2】:

我想我终于发现了你的第 47 行是什么:

Spider::Spider(string name):Invertebrate(name&,EXOSKELETON,8)
{
    name = NAME_PREFIX + Invertebrate::getName();
}

这个函数有两个问题:

  1. name&amp; 中的 &amp; 是什么?这不是有效的语法!
  2. 您不能直接访问this-&gt;name,因为它在基类中是私有的。相反,您在这里修改了本地 name 参数,这没有任何用处。

您可以将基础 name 设为公开或受保护。或者你可以添加一个setName() 受保护的函数。

但在我看来,这个成员是私有的和只读的。解决方案是在构建时指定正确的name

Spider::Spider(string name)
    :Invertebrate(NAME_PREFIX + name, EXOSKELETON, 8)
{
}

【讨论】:

  • 我进行了这些更改,但我的程序现在崩溃了。