子类获取超类私有变量c ++

时间:2016-03-24 19:44:25

标签: c++ inheritance

我有一个超类,它有一些私有变量,我需要为子类构建一个构造函数。这是超类:

class Shape {
public:
    Shape(double w, double h);
    string toString();

private:
    double width;
    double height;

};

超类构造函数:

Shape::Shape(double w, double h) {
    width = w;
    height = h;
}

子类:

class Rectangle : public Shape {

public:
    Rectangle(double w, double h, int s);
    string toString();

private:
    int sides;

};

我的子类构造函数如下:

Rectangle::Rectangle(double w, double h, int s) : Shape(w, h) {

    width = w;
    height = h;
    sides = s;

}

我根本无法修改超类。我所能做的就是修改构造函数类以获取超类中私有的值。

2 个答案:

答案 0 :(得分:2)

派生构造函数不负责设置widthheight。实际上,它甚至不能看到它们。您可以制作protected甚至public,但为什么?只有基地才能管理自己的成员,这是一件好事。

你已经为基础构造函数指定了参数,所以你很高兴。删除冗余和折断的行后,这里没有问题:

struct Shape
{
    Shape(double w, double h)
    {
       width  = w;
       height = h;
    }

private:
    double width;
    double height;
};

struct Rectangle : Shape
{
    Rectangle(double w, double h, int s)
      : Shape(w, h)
    {
       sides = s;
    }

private:
    int sides;
};

顺便说一句,你应该尽可能标准化使用 ctor-initialiser ,而不是仅在有时使用它,然后在其他时间从身体分配:

struct Shape
{
    Shape(double w, double h)
      : width(w)
      , height(h)
    {}

private:
    double width;
    double height;
};

struct Rectangle : Shape
{
    Rectangle(double w, double h, int s)
      : Shape(w, h)
      , sides(s)
    {}

private:
    int sides;
};

答案 1 :(得分:0)

如果我理解正确,你想要修改超类'私有变量通过子类构造后。

首先,在超类中实现set()方法,以便我们可以访问其private变量:

Shape.h

class Shape {
public:
    Shape(double w, double h);
    string toString();
    //here
    setWidth(double);
    setHeight(double);

private:
    double width;
    double height;

};

Shape.cpp

Shape::setWidth(double w) { width = w; }
Shape::setHeight(double h) { height = h; }

然后,您可以通过子类调用超类set()方法:

Rectangle构造函数:

Rectangle(double w, double h, int s)
      : width(w)       // subclass width
      , height(h)
{
    // modify subclass width & height as desired here

    //then reflect superclass width & height according to subclass
    Shape::setWidth(width);    
    Shape::setHeight(height);
}
可以在子类中随时随地调用

Shape::setWidth()Shape::setHeight(),并相应地反映超类 private变量。< / p>