C ++继承:各种派生对象的基本属性

时间:2016-12-21 17:36:13

标签: c++ inheritance subclass superclass

我目前正在学习C ++继承,所以如果这个问题很愚蠢,我会事先道歉。

实施此方案:

  1. 超类具有颜色属性,可以是任何颜色(假设颜色由整数表示)。

  2. 假设我有一个超级类的初始化,颜色为红色。

  3. 我还要初始化一个也分享红色的子类的不同对象。

  4. 我的问题是,有什么方法可以将这个属性颜色初始化为红色(或任何颜色),并且它会被它的子类的对象自动继承,而不是设置我每次初始化其中一个对象时属性为红色?

    如果我在这里错过了一个基本概念,再次道歉,但我似乎无法在网上找到任何内容。

    每个请求的伪代码:

    超级代码:

    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)
        { }
    }
    

    我想说的是方形和圆形需要具有相同的颜色,无论如何(可能来自超类?)来声明这种颜色(例如红色),两种形状都会这个颜色设置相同吗?

4 个答案:

答案 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";
}