从基类继承私人成员到派生类C

Inheriting private members from base class to derived classes c++

本文关键字:派生 成员 基类 继承      更新时间:2023-10-16

我正在尝试从我的基类继承名称,skeletontype和numlegs到我的派生类。我有一个名为无脊椎动物的基类,名为蜘蛛。我希望能够将私有变量与我的基类派生类一起使用。我一直在第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;
}

输出:

这是您的代码中的问题: -

  1. 在.h文件 -

const字符串name_prefix ="蜘蛛:";

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

正确的方法.cpp

Spider::Spider(string name):NAME_PREFIX(name),Invertebrate(name,EXOSKELETON,8)
{
    name = NAME_PREFIX + Invertebrate::getName();
}
  1. 在同一构造函数中,您拥有的名称&amp;这是错误的,只需传递名称即可。

蜘蛛::蜘蛛(字符串 名称):name_prefix(名称),无脊椎动物(名称,外骨骼,8)

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

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

此功能有两个问题:

  1. name&中的&是什么?那不是有效的语法!
  2. 您无法直接访问this->name,因为它在基类中是私有的。相反,您正在修改本地name参数,这无用。

您可以将基本name公开或受到保护。或者您可以添加setName()受保护的功能。

但我认为,这个成员可以私密而只读。解决方案是在施工时指定正确的name

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