2013-01-22 2 views
1

세 클래스가 있습니다. 기본 클래스는 Jet라고 :생성자 상속 문제

class Jet 
{ 
public : 
    Jet(int fuel); 
    void fly(); 

protected: 
    int mfuel; 
}; 

Jet::Jet(int fuel): mfuel(fuel) {} 

는 두 번째 클래스는 F16라고 :

class F16 : public Jet 
{ 
public: 
    F16(int fuel, int numMissiles); 
    void fireMissile(); 

protected: 
    int mNumMissles; 
}; 

F16::F16(int fuel, int numMissiles): Jet(fuel), mNumMissles(numMissiles) {} 

의 제 3 유형 B18F16에서 일반적으로 모든 것을 상속

class B18 : public F16 
{ 
public: 
    B18(int fuel, int numMissiles, int bullets); 
    void fireBullets(); 

private: 
    int mBullets; 

}; 

지금 내 질문은

입니다 거기에 회원 이니셜 라이저 여기에 방법 :

B18::B18(int fuel, int numMissiles, int bullets) : 
     F16(fuel, numMissiles), mBullets(bullets) {} 

... 그래서 난 그냥 B18에서 int fuel를 지울 수 있습니다, 단지 F16에서 numMissiles을 상속? 예를 들어 위의 같은

B18::B18(int numMissiles, int bullets) : 
     F16(numMissiles), mBullets(bullets) {} 

뭔가 (물론 아마 작동하지 않고 논리적 인 오류가 있습니다).

+4

나는 "smthg"또는 "ofc"를 이해하지 못합니다. 그것들을 완전한 단어로 바꿀 수 있습니까? –

+0

이것이 고의적 인 예라고 생각하지만, 디자인 관점에서 볼 때 'B18'은 'F16'이 아닙니다. 둘 다'Jet'를 상속 받아야합니다. 아마도 당신이 해결하고자하는 진짜 문제를 기술 할 수 있습니다. –

+0

Ofc & Ofcourse, Smthg & something – RedFox

답변

1

귀하의 의견은 문제에 대한 추가 정보를 제공했습니다. 그래서 가시성을 위해 여기에 인용 해요 :

내가 실험 된 것은 단지 numMussiles 부분처럼 B18에 F16의 단지 일부를 초기화 할 가능성이 아니라도 연료에서이있는 경우 생성자 ... 회원 초기 자에게 상속하고 싶은 것을 선택할 수있는 짧은 단어로

과부하가 걸린 생성자가 문제를 해결할 수있는 것처럼 보입니다. 다른 생성자를 클래스 F16에 추가하십시오. 따라서 초기화 할 항목을 기반으로 파생 클래스에서 적절한 생성자를 선택할 수 있습니다.여기

은 당신이 할 수있는 것입니다 :

class F16 : public Jet 
{ 
public: 
    F16(int numMissiles); //<------ add this 
    F16(int fuel,int numMissiles); 
    void fireMissile(); 

    protected: 
    int mNumMissles; 
}; 

는 당신이 초기화하려는 내용에 따라 생성자를 선택할 수 있습니다

//unchanged : from your code! 
B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets) {} 

그것은 F16에서 첫 번째 생성자를 선택합니다. 클래스를 완전히 초기화하는 것이 더 낫습니다. 이는 모든 멤버를 일부 [기본값] 값으로 초기화한다는 것을 의미합니다 (특별한 경우에는 필요하지 않더라도).

2

나는 상속이 완전히 차단 될 수는 없지만 회원 초기화 코드 줄을 언급했는지 의심 스럽다. 따라서 다음과 같이 할 수 있습니다.

B18::B18(int numMissiles,int bullets): F16(30,numMissiles),mBullets(bullets) {} 

당신은 이미 알고있을 것입니다.

public: 
    F16(int numMissiles, int fuel = 45); 

과 : 또 다른 옵션은 다음과 같이 될 것이다

B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets) {} 

내가 그건 당신이 필요로 정확히 무엇인지 잘 모르겠지만, 어쩌면 도움이됩니다. 다시 말하지만 이것에 대해서는 잘못 될 수 있습니다 만, 상속을 통해 기본 클래스의 변수를 설정하는 것만 큼 의심 스럽습니다. 가장 가까운 것은 포인터 변수를 초기화하지 않은 상태로 두는 것입니다.

+0

첫 번째 속임수를 알지 못했습니다. – RedFox

+0

그러나 정수를 전혀 사용하지 않는 방법이 있습니까? – RedFox

+0

Redfox, 당신은'Jet'을 정수'fuel' 인자를 요구하는 것으로 정의했습니다. 'Jet'을 변경하여 옵션을 옵션으로 만들지 않는 한,'Jet' 인스턴스를 생성하는 다른 모든 코드는 * anyhow * 값을 제공해야합니다. 이 응답의 코드에서와 같이 원래 코드에서와 같이 호출자에게 책임을 전가하거나 기본 선택을 할 수 있습니다. –

0

존재하지 않는 값을 상속받을 수 있기 때문에 정확히 무슨 뜻인지 확실치 않습니다. 하지만 어쩌면 당신이하려는 것은 기본 매개 변수를 포함합니까? 그래서 예를 들면, 당신은 할 것 : 이런 식으로

class Jet 
{ 
public : 
    Jet(int fuel); 
    void fly(); 

protected: 
    int mfuel; 
}; 

Jet::Jet(int fuel): mfuel(fuel) {} 

class F16 : public Jet 
{ 
public: 
    F16(int numMissiles = 10, int fuel = 20); 
    void fireMissile(); 

protected: 
    int mNumMissles; 
}; 

F16::F16(int numMissiles, int fuel): Jet(fuel), mNumMissles(numMissiles) {} 

class B18: public F16 
{ 
public : 
    B18(int bullets, int numMissiles, int fuel); 
    B18(int bullets); 
    void firebullets(); 

private: 
    int mBullets; 
}; 

B18::B18(int bullets, int numMissiles, int fuel) : F16(numMissiles, fuel), mBullets(bullets) {} 
B18::B18(int bullets): F16(), mBullets(bullets) {} 

을 기본 매개 변수를 사용하여 F16 생성자를 호출하는 단일의 int 매개 변수와 B18 객체를 생성.

+1

스택 오버플로에 오신 것을 환영합니다. "너는 존재하지 않는 가치로부터 물려받을 수있다"는 말이 틀렸다. 명확히하거나 바꾸기 위해 답을 주시겠습니까? –

+0

@ RobKennedy 나는 "생성자와 메소드에 대한 인수의 기본값이 존재하기 때문에 이것을 보여 드리겠습니다."*는 느슨하게 번역했습니다. 아마도. :-)하지만 예, 환영합니다 user2001505 - 편집은 재미의 큰 부분입니다. 또한 사용자 이름을 설정하는 데 도움이되며 [개인 아바타를 업로드 할 수도 있습니다] (http://blog.stackoverflow.com/2013/01/announcing-a-new-way-to-change-your-profile- 그림 /) 아주 쉽게. – HostileFork