2013-05-10 2 views
2

Я просто попадаю в производные классы, и я работаю над известным классом Shape. Shape - базовый класс, тогда у меня есть три производных класса: Circle, Rectangle и Square. Square - производный класс Rectangle. Я думаю, мне нужно передать аргументы из конструкторов производного класса в конструктор базового класса, но я точно не знаю, как это сделать. Я хочу установить размеры фигур при их создании. Вот то, что у меня есть для базового класса и одного производного класса:Передача аргументов конструктору суперкласса

Shape(double w = 0, double h = 0, double r = 0) 
{ 
    width = w; 
    height = h; 
    radius = r; 
} 


class Rectangle : public Shape 
{ 
    public: 
    Rectangle(double w, double h) : Shape(double w, double h) 
    { 
     width = w; 
     height = h; 
    }    
    double area(); 
    void display();  
}; 

Я здесь на правильном пути? Я получаю следующую ошибку компилятора: expected primary expression before "double", в каждом из производных конструкторов.

+0

Для вашей ошибки компилятора, вы должны удалить 'double's в «Shape (double w, double h)» после двоеточия, поскольку вы на самом деле вызываете конструктор базового класса. – Yang

+0

Кроме того, рассмотрите возможность использования инициализаторов-членов для инициализации элементов Shape, а не присваивания, т. Е. Конструктор Shape выглядит так: 'Shape (double w = 0, ...): width (w), height (h), радиус (r) {} '. –

+0

Что такое радиус на общей форме? Возможно, вам нужно переосмыслить свой класс. –

ответ

2

Вы должны изменить Shape(double w, double h) на Shape(w, h). Вы на самом деле , вызывающий базовый конструктор здесь.

Кроме того, Вам не нужно устанавливать width и height в теле конструктора производного класса:

Rectangle(double w, double h) : Shape(w, h) 
    {} 

достаточно. Это связано с тем, что в списке инициализатора Shape(w, h) вызовет конструктор базового класса (shape), который установит эти значения для вас.

Когда полученный объект создается, то будет выполнено следующее:

  1. памяти для Shape отведен
  2. Соответствующий базовый конструктор вызывается
  3. В списке инициализации инициализирует переменные
  4. корпус конструктора
  5. Управление возвращается абоненту

В вашем примере подобъект Shape инициализирован Shape(double w = 0, double h = 0, double r = 0). В этом процессе все элементы базовой части (width, height, radius) инициализируются базовым конструктором. После этого выполняется тело производного конструктора, но вам ничего здесь не нужно, потому что все они заботятся о базовом конструкторе.

+0

Тело конструктора формы? Может ли это быть пустым? – user2302335

+0

@ user2302335 Я имею в виду тело конструктора Rectangle. – Yang

0

Практически. Вместо повторного объявления параметров здесь:

Rectangle(double w, double h) : Shape(double w, double h) 

Вы должны просто «передать их через» (чтобы дать неточную формулировку):

Rectangle(double w, double h) : Shape(w, h) 
{ } 
Смежные вопросы