Наследование и Конструкторы - PullRequest
0 голосов
/ 30 мая 2011

Это не домашнее задание, просто несколько упражнений для моего класса C ++, чтобы привыкнуть к наследованию и прочим вещам. Итак, первая часть упражнения просит нас создать программу с одним именем класса Rectangle, и мы должны сделать конструкторы геттерами и сеттерами и найти область и периметры. Эта часть работает нормально. Во второй части упражнения говорится, чтобы создать новый класс с именем Square, который расширяет Rectangle и у которого есть конструктор, который в качестве аргумента будет иметь ширину квадрата. Затем программа должна напечатать площадь и периметр.

#include <iostream>
using namespace std;

class Rectangular {

    private:
        int width;
        int height;

    public:

        Rectangular () {
            width = 5;
            height = 5;
        }

        Rectangular (int w, int h) {
            width = w;
            height = h;
        }

        void setWidth (int w) {
            width = w;
        }

        void setHeight (int h) {
            height = h;
        }

        int getWidth () {
            return width;
        }

        int getHeight () {
            return height;
        }

        int getArea () {
            return width*height;
        }

        int getPerimeter () {
            return width+height;
        }
 };

class Square : public Rectangular{
    public:
        Square (int w) {
           getWidth();
        }
};

int main(int argc,char *argv[])
{
    Rectangular a, b(10,12);
    Square c(5);
    cout << "Width for a: " << a.getArea() << " Perimeter for a: " << a.getPerimeter() << endl;
    cout << "Width for b: " << b.getArea() << " Perimeter for b: " << b.getPerimeter() << endl;
    cout << "Area for c: " << c.getArea() << " Perimeter for c: " << c.getPerimeter() << endl;
 }

Программа распечатывает

Width for a: 25 Perimeter for a: 10
Width for b: 120 Perimeter for b: 22
Area for c: 25 Perimeter for c: 10

По какой-то причине c получает значения a. Есть мысли?

Ответы [ 5 ]

5 голосов
/ 30 мая 2011

Вы забыли связать конструктор для Square. Вы хотите изменить конструктор Square следующим образом:

  Square(int w) : Rectangle(w,w) {}
2 голосов
/ 30 мая 2011

Ваш a не определяет никаких значений в своем конструкторе, поэтому его 5x5.То же, что вы указали для c (здесь вы также не определили начальную ширину / высоту - обратите внимание, что вы не вызываете какой-либо конкретный конструктор Rectangular и, следовательно, используется значение по умолчанию).Таким образом, это не «получение значений», а просто инициализация таким же образом.

1 голос
/ 30 мая 2011

Ваш конструктор в унаследованном классе Square должен быть:

     Square(int w) :  Rectangular (w, w)
     {
       /* do what ever */
       getWidth();
     }

Какой смысл использовать вызов getWidth ()?удалите его.

EDIT1 :

Примечание: cout<<"Width for a: "<<a.getArea()<<" Perimeter for a: "<<a.getPerimeter()<<endl;

Вы написали "Width for a: ", но фактически напечатали область, вызвав a.get_Area ();

0 голосов
/ 30 мая 2011

Это упражнение на самом деле является хорошим примером неправильного использования наследования :) Хотя математически квадрат всегда также является прямоугольником, при попытке смоделировать его в C ++ он может быть сложным.

Пример: экземпляр LuxuryCar всегда можно использовать там, где ожидается Car; однако Square не всегда может использоваться вместо Rectangle (например, в этом окне).

Чтобы проиллюстрировать это на вашей реализации - ваш Square наследует методы setWidth и setHeight. Если вы используете их на квадрате, вы ломаете его - это уже не квадрат. Таким образом, вы должны переопределить их, чтобы сохранить ограничения квадрата. Но если вы это сделаете, я не уверен, что вы получите, наследуя от Rectangle. Кроме того, Square предоставляет API (набор методов), который не согласуется с его природой (в квадрате явно нет ширины).

0 голосов
/ 30 мая 2011

Происходит то, что b создается с width и height, которые вы установили (10 и 12 соответственно), и a создается по умолчанию с 5 и 5. Если вы посмотрите, ваш Square создан с использованием вашего конструктора по умолчанию, который из-за вашего вызова getWidth() (и всего) создает родительский экземпляр (используя его конструктор по умолчанию), который устанавливает его как 5 на 5. Таким образом вы получаете такие же а и с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...