2015-12-15 8 views
1
#include <iomanip> 
#include <iostream> 
#include <string> 
using namespace std; 

class Box 
{ 
protected: 
    double length; 
    double width; 
    double height; 
public: 
    // Constructors 
    Box(double lv, double wv, double hv) : length {lv}, width {wv}, height {hv} 
    { std::cout << "Box(double, double, double) called.\n"; } 

    Box(double side) : Box {side, side, side} 
    { std::cout << "Box(double) called.\n"; } 

    Box() { std::cout << "Box() called.\n"; } 

    double volume() const 
    { return length * width * height; } 

    double getLength() const { return length; } 
    double getWidth() const { return width; } 
    double getHeight() const { return height; } 
    ~Box() 
    { cout << "box destructor" << endl; } 
}; 


class Carton : public Box 
{ 
private: 
    string material {"Cardboard"}; 
public: 
    Carton(double lv, double wv, double hv, const string desc) : Box {lv, wv, hv}, material {desc} 
    { std::cout << "Carton(double,double,double,string) called.\n"; } 

    Carton(const string desc) : material {desc} 
    { std::cout << "Carton(string) called.\n"; } 

    Carton(double side, const string desc) : Box {side},material {desc} 
    { std::cout << "Carton(double,string) called.\n"; } 

    Carton() { std::cout << "Carton() called.\n"; } 

    ~Carton() 
    { cout << "carton destructor" << endl; } 
}; 

int main() 
{ 
     Carton carton3 {4.0, "Plastic"}; 
} 

В этом коде я ожидаю, как выходнаследования выходной конструктор

Box(double) called. 
Carton(double,string) called. 
cartoon destructor 
box destructor 

Но это показывает, как выход

Box(double, double, double) called. 
Box(double) called. 
Carton(double,string) called. 
cartoon destructor 
box destructor 

Я не понимаю, что как Box(double, double, double) called. отображается на экране. Я проследил код шаг за шагом, но он не должен быть на выходе. Может кто-нибудь объяснить проблему? Благодарю.

+2

Как вы думаете, что это делает? 'Коробка (двойная сторона): Коробка {сторона, сторона, сторона}'? – juanchopanza

+2

Вы используете [делегирующий конструктор] (http://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor). Это правильное поведение. – NathanOliver

+0

@askque Не могли бы вы отметить ответ, как принято, если вы сочтете это полезным, конечно. –

ответ

1

Эта линия

Carton(double side, const string desc) : Box {side},material {desc} 

указывает, что конструктор Box::Box(double side) будет называться. Тем не менее, этот конструктор определяется как:

Box(double side) : Box {side, side, side} // HERE is the call to second constructor 
{ std::cout << "Box(double) called.\n"; } 

, что означает, что он будет в конструкторе очередь вызова Box::Box(double lv, double wv, double hv). Ожидается поведение, которое вы описываете. Поместите контрольную точку в строке:

{ std::cout << "Carton(double,double,double,string) called.\n"; } 

и вы увидите, что при запуске программы она будет удалена.

Смежные вопросы