2016-12-21 7 views
1

현재 C++ 상속에 대해 배우고 있습니다. 따라서이 질문이 벙어리 인 경우 사전에 사과드립니다.C++ 상속 : 다양한 파생 객체에 대한 기본 속성

이 시나리오를 구현 :

  1. 슈퍼 클래스 (는) 모든 색상이 가능한 색 속성을 가지고 (정수로 표시의 색상을 가정하자).

  2. 빨간색으로 표시된이 수퍼 클래스의 초기화가 있다고 가정 해 보겠습니다.

  3. 또한 빨강 색을 공유하는 하위 클래스의 서로 다른 개체를 초기화하려고합니다. 내 질문은

, 내가 빨간색이 속성 색상 (또는 그 문제에 대한 모든 색상)을 초기화 할 수있는 방법이 존재하고 대신 설정의 하위 클래스의의 자동 객체에 의해 상속 될 것이다 매번 빨간색으로 속성을 지정합니다.이 객체 중 하나를 초기화합니까?

다시 한 번 사과 드리겠습니다. 기본 개념이 없지만이 부분에 대해서는 온라인에서 찾을 수 없습니다. 요청에 따라

의사 코드 :

슈퍼 클래스 코드 :

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

기본 클래스에 color 속성이 있고 파생 클래스에도 color 속성이 있습니까? MVCE가 도움이 될 것입니다. –

+0

아니요. 색상 속성이 슈퍼 클래스에서 분명히 상속 받고 있지 않습니다. – Logan

+0

상황이 어떻게 보이는지에 대한 의사 코드 예제를 게시하십시오. "attribute"라는 단어를 사용하고 있지만 "속성"(멤버 변수, 가상 멤버 함수와 기본 구현 등)을 구현하는 방법은 매우 많습니다. 또한 누가 초기화 작업을 수행하고 있습니까? (또한 : initialize *는 매번 값을 조금씩 다르게 설정합니다.) – iAdjunct

답변

1

당신은 더 색상이 명시 적으로 지정되지 않은 경우에 사용됩니다 정적 default_color으로 원하는 것을 달성 할 수 있고, 색이 될 때마다 설정됩니다 : 사용자의 선택한 색상 무시

이 샘플 프로그램 인쇄 (7), 지정된.

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 
} 

이 디자인은 좋지 않습니다. 이와 같은 세계적인 국가는 실수를하는 것을 아주 쉽게 만듭니다. 이제 모양을 만들 때마다 전체 프로그램의 상태를 생각해야합니다. CircleCircle cir(10, sq.color);으로 간단하게 만드는 것이 좋습니다. 그게 당신의 Circle 색깔을 명확하게하고, 프로그래머의인지 부하를 줄여줍니다.

+0

나는 본다. 나는이 개념을 호기심에서 탐구하고 있었고 명확한 설명이 필요했습니다. 실용적인 응용 프로그램에 관해서는 그렇습니다. 나는 그것이 당신에게 불리한 관행이고 파괴적이라는 것을 증명할 수 있다는 것에 동의합니다. 감사 – Logan

1

전에 C++ 11을,이 것 할 수있는 기본 방법은 다음과 같이 나중에 C++ (11)와 함께

class baseClass 
{ 
    int color; 

    baseClass() { color = RED; } 
}; 

class subClass : public baseClass 
{ 
    subclass() { } 
}; 

, 당신은 클래스 선언의 기본 값을 할당 할 수

class baseClass 
{ 
    int color = RED; 

    baseClass() { } 
}; 

이것은 상속됩니다.

편집 : 아래에 언급 된 것처럼 기본 baseClass 생성자는이 경우 자동으로 호출됩니다.

+0

이니셜 라이저 목록을 사용할 수도 있습니다. –

+1

': baseClass()'는 절대로 AFAIK를 요구하지 않았습니다. –

+0

@ A.S.H 틀 You 확실합니다. 나는 폐렴을 탓한다. :) –

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; 
} 
0

는 (? 어쩌면 슈퍼 클래스에서)이 색상을 선언하는 어쨌든이며, 모두 모양이 색상이 동일하게 설정 한 것 ?

게시 된 예에서 예. 정의 된 생성자를했다

Shape::Shape(int c) : color(7) { } // 7 == RED 

Shape 경우, 모든 서브 클래스의 인스턴스가 붉은 모양을 나타내는 것이다 : 그것은 예를 들어,에 원하는 무엇이든 슈퍼 클래스 생성자에 그 변수를 설정할 수 있습니다.

#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"; 
} 
+0

사실, 색상 옵션을 여러 개 사용할 수있는 생성자를 가질 수 있습니까? 이를 기반으로 하위 클래스가 초기화되기 전에 다른 색상으로 설정된 수퍼 클래스 (Shape)의 인스턴스가 여러 개있을 경우 색상 속성이 수퍼 클래스의 마지막 초기화와 동일한 색상으로 설정됩니까? – Logan

+0

수퍼 클래스의 인스턴스를 원하는만큼 가질 수 있습니다. 하위 클래스의 특정 인스턴스와 관련된 중요한 수퍼 클래스 인스턴스는 해당 하위 클래스 인스턴스에 포함 된 것입니다. –