C++ C++;无法使用派生类访问类的私有成员的代码

C++ C++;无法使用派生类访问类的私有成员的代码,c++,C++,目前,我在下面的代码中尝试在实例化类型为Solid的对象时将数据成员x、y和z初始化为0。第25、26和27行包含错误,如何重写这些行以访问x和y成员并将其设置为0 编辑1:我已经在下面写出了我的代码 编辑2:为了澄清问题,唯一可以修改的代码行是包含错误的代码行。应该重写派生类以访问私有数据成员 class Shape { private: int x, y; protected: string _type; public: Shape() { x = y =

目前,我在下面的代码中尝试在实例化类型为Solid的对象时将数据成员x、y和z初始化为0。第25、26和27行包含错误,如何重写这些行以访问x和y成员并将其设置为0

编辑1:我已经在下面写出了我的代码

编辑2:为了澄清问题,唯一可以修改的代码行是包含错误的代码行。应该重写派生类以访问私有数据成员

class Shape
{

private:

    int x, y;

protected:

    string _type;

public:

    Shape() { x = y = 0; }
    Shape(int a, int b) { x = a; y = b; }
    string type() { return _type; }
    void stype(string val) { _type + val; }
    int getx() { return x; }
    int gety() { return y; }

};

class Solid : public Shape
{

    int z;

public:

    Solid() { x = y = z = 0; } // errors
    Solid(int a, int b, int c) { x = a; y = b; z = c; } //
    int Volume() { return x * y * z; } //
};

int main()

{

    Solid ob1;

    return 0;
}

继承的类无法访问父类的私有属性。它可以访问他的受保护属性,因此您可以将变量移动到受保护的。另一个选项是使用setter函数(比如getX)并使用它们

编辑:仅更改相关错误行:

Solid():形状(0,0){this->z=0;}
实心(inta,intb,intc):形状(a,b){this->z=c;}
int Volume(){返回this->getx()*this->get.y*this->z;}
创建
实体
对象时,还可以使用所需的值调用
形状
的命令。这是创建新继承对象时初始化
x,y
值的正确方法。对于第三行计算,应使用
getx()
gety()
函数。
如前所述,关键是要理解x和y不能直接用于Solid object

私有数据成员在任何类型的继承中都不会被继承。因此命名为private,但有趣的是,您可以在这里使用friend类概念,甚至现在可以继承私有数据成员

请尝试运行以下代码:

#include <bits/stdc++.h>
using namespace std;
class Shape
{

private:

    int x, y;

protected:

    string _type;

public:

    Shape() { x = y = 0; }
    Shape(int a, int b) { x = a; y = b; }
    string type() { return _type; }
    void stype(string val) { _type + val; }
    int getx() { return x; }
    int gety() { return y; }
    friend class Solid;

};

class Solid : public Shape
{

    int z;

public:

    Solid() { x = y = z = 0; } // errors
    Solid(int a, int b, int c) { x = a; y = b; z = c; } //
    int Volume() { return x * y * z; } //
};

int main()

{

    Solid ob1;

    return 0;
}
#包括
使用名称空间std;
阶级形态
{
私人:
int x,y;
受保护的:
字符串类型;
公众:
Shape(){x=y=0;}
形状(inta,intb){x=a;y=b;}
字符串类型(){return\u type;}
void stype(字符串val){u type+val;}
int getx(){return x;}
int gety(){return y;}
朋友级扎实;
};
类实体:公共形状
{
intz;
公众:
Solid(){x=y=z=0;}//错误
固体(inta,intb,intc){x=a;y=b;z=c;}//
int Volume(){return x*y*z;}//
};
int main()
{
固体ob1;
返回0;
}
现在您也可以在继承的类中访问x,y,因为您将类solid声明为shape类的朋友


希望这能回答您的问题。

您不能直接继承父类的私有成员。您可以在派生类(子类)构造函数中使用它的构造函数,尽管它很酷,但我不这么做。有关访问说明符(您声明的继承类型)的一些信息:

  • Public:派生类将父类的受保护成员继承为受保护成员,将Public继承为公共成员
  • 受保护:派生类将父类的受保护成员继承为受保护成员,将公共类继承为受保护成员
  • Private:派生类将父类的受保护成员继承为Private,将public继承为Private
再次注意,父类的私有成员不是继承的。这应该可以做到: 更改:

进入:

使用父类构造函数应该如下所示:

class Solid : public Shape
{
private://doesn't matter, just for the aesthetics
    int x;
    int y;
    int z;

public:

    Solid() { 
    Shape();
    z = 0; } // errors
直接的方法是(您的代码添加了x,y作为类的属性):


您不能访问基类的私有成员,本练习的重点是您不需要访问,而不是您应该想出一种方法

默认构造函数应该只设置自己的成员-
Shape
s默认构造函数负责自己的成员:

Solid() { z = 0; }
或(首选方法,实际上是初始化而不是赋值)

另一个构造函数应该初始化基,然后
z

Solid(int a, int b, int c) : Shape(a,b), z(c){}
应使用提供的访问者:

int Volume() { return getx() * gety() * z; }

将代码发布为文本,而不是图像链接。您应该将代码发布在此处。不是代码的映像。派生类不会继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,其中包含该类声明的任何私有成员。我应该修改那些包含错误的行来访问变量。我不得不使用getx和gety函数来实现这一点。@ronny45098我编辑我的帖子只是为了修改三条相关的行请接受别人给你的答案中的一条,以明确你的问题已经得到了回答只是为了澄清,不要做所有的修改,只做其中的一条。这是解决这个问题的三种不同方法。
Solid() { z = 0; }
Solid() :z(0) {} 
Solid(int a, int b, int c) : Shape(a,b), z(c){}
int Volume() { return getx() * gety() * z; }