我有一个超类,它有一些私有变量,我需要为子类构建一个构造函数。这是超类:
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;
}
我根本无法修改超类。我所能做的就是修改构造函数类以获取超类中私有的值。
答案 0 :(得分:2)
派生构造函数不负责设置width
和height
。实际上,它甚至不能看到它们。您可以制作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>