我目前正在学习C ++继承,所以如果这个问题很愚蠢,我会事先道歉。
实施此方案:
超类具有颜色属性,可以是任何颜色(假设颜色由整数表示)。
假设我有一个超级类的初始化,颜色为红色。
我还要初始化一个也分享红色的子类的不同对象。
我的问题是,有什么方法可以将这个属性颜色初始化为红色(或任何颜色),并且它会被它的子类的对象自动继承,而不是设置我每次初始化其中一个对象时属性为红色?
如果我在这里错过了一个基本概念,再次道歉,但我似乎无法在网上找到任何内容。
每个请求的伪代码:
超级代码:
class Shape {
int color;
Shape::Shape(int c) : color(c) { } //constructor
}
子类代码:
class Square {
int length, width;
Square::Square(int l, int w, int c)
: length(l),
width(w),
color(c)
{ }
}
class Circle {
int radius;
Square::Square(int r, int c)
: radius(r),
color(c)
{ }
}
我想说的是方形和圆形需要具有相同的颜色,无论如何(可能来自超类?)来声明这种颜色(例如红色),两种形状都会这个颜色设置相同吗?
答案 0 :(得分:1)
在C ++ 11之前,执行此操作的主要方法如下:
class baseClass
{
int color;
baseClass() { color = RED; }
};
class subClass : public baseClass
{
subclass() { }
};
使用C ++ 11及更高版本,您可以在类声明中指定默认值:
class baseClass
{
int color = RED;
baseClass() { }
};
这将是遗传的。
编辑:如下所述,在这种情况下会自动调用默认的baseClass
构造函数。
答案 1 :(得分:1)
您可以使用在未明确指定颜色时使用的静态default_color
来完成您想要的任务,并在指定颜色时设置。
struct Shape {
static int default_color;
int color;
Shape(int c) : color(c)
{
default_color = c;
}
Shape() : color(default_color) {}
};
Shape::default_color = BLACK;
struct Square : public Shape {
int length, width;
Square(int l, int w, int c)
: Shape(c),
length(l),
width(w),
{ }
Square(int l, int w)
: length(l),
width(w)
{ }
}
struct Circle : public Shape {
int radius;
Circle(int r, int c)
: Shape(c),
radius(r)
{ }
Circle(int r)
: radius(r)
{ }
}
int main()
{
Square sq(2, 3, RED);
Circle cir(10); // Automatically red, since that's
the last color explicitly specified
}
我会说这是一个糟糕的设计。像这样的全球状态很容易犯错误。您现在必须在创建形状时考虑整个程序的状态。最好将Circle
简单地创建为Circle cir(10, sq.color);
。这使得它明确了Circle
的颜色,并降低了程序员的认知负担。
答案 2 :(得分:0)
类和类的实例之间存在差异。类就像结构,根据该结构将创建更多实例。类就像描述,指令如何构建对象。继承与类有关,而与对象无关。对于字段,继承的类具有父类的所有相同字段以及您可以添加的一些新字段。
一个简单的例子:
class MyBase {
public:
int color;
};
class MyChild : public MyBase {
public:
double length;
}
int main() {
MyBase myBaseObj;
myBaseObj.color = 1;
MyChild myChildObj;
myChildObj.color = 2;
myChildObj.length = 3.14;
return 0;
}
答案 3 :(得分:0)
无论如何(可能来自超类?)声明这种颜色(例如红色),两种形状的颜色设置是否相同?
在您发布的示例中,是的。超类构造函数可以将其变量设置为它想要的任何变量,例如:
Shape::Shape(int c) : color(7) { } // 7 == RED
如果Shape
定义了构造函数,则每个子类的实例都将表示红色形状。
此示例程序打印7,覆盖用户选择的颜色:
#include <iostream>
class Shape {
public:
int color;
Shape(int c) : color(7) { } //constructor
};
class Square : public Shape {
public:
int length, width;
Square(int l, int w, int c)
: Shape(c),
length(l),
width(w)
{ }
};
class Circle : public Shape {
public:
int radius;
Circle(int r, int c)
: Shape(c),
radius(r)
{ }
};
int main() {
Square q(4,8,0);
std::cout << q.color << "\n";
}