2017-10-16 9 views
-1

상속에 대해이 문제가 있습니다. 머리를 감쌀 수 없습니다. 나는 그들 사이에 부모 관계가있는 세 가지 수업을 가지고있다. 그들 모두는 기능이 입니다 calcForces(). 상속 : 자식이 자신의 부모 가상 함수를 사용합니다.

class Object { 
public: 
    virtual void calcForces(); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(); 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Wind wind); 
}; 

지금 내 문제 II (그리고 객체 포인터를 저장)를 요트으로 만든 개체가,하지만 난 calcForces()를 호출 할 때 나는 :: 보트 안에 끝날 것입니다 calcForces() 아니요 Sailboat :: calcForces(). 내가 도대체 ​​뭘 잘못하고있는 겁니까? 오버라이드 (override)의

(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**' 
+2

[MCVE]를 보여주십시오. –

+2

다형성 동작을 위해 포인터를 통해 호출해야합니다. 시도해보십시오 :'this-> object_ptr_arr [i] -> calcForces();' – Galik

+4

이런 종류의 문제를 피하려면 http://en.cppreference.com/w/cpp/language/override – stefaanv

답변

11

선언이 일치해야합니다

다음은 함수 내 호출입니다. Sailboat::calcForces에 대한 선언은 다른 매개 변수 (Wind 인스턴스)를 취하므로 무시할 수 없습니다.

@stefaanv 및 @skypjack에 의해 주석 처리되었으므로, 컴파일시 오류를 발견 한 override 함수 지정자를 사용하여이 문제를 피할 수 있습니다.

+0

캐치 :) – fjardon

+0

을 참조하십시오. 나는 컴파일 타임에 그것을 검사하고 에러를 피하기 위해 match의 목적을 제공하는'override' 키워드를 언급 할 것이다. – skypjack

+0

@skypjack 완료! – acraig5075

2

범선에 calcForces() 방법을 원하면 거기에 추가해야합니다. 순간 당신은 당신의 요트에 calcForces(Wind wind) 방법 (및 Boat에서 상속 된 calcForces()) 당신이 매개 변수없이 calcForces를 호출 할 때

은 그래서 상속 방법에 끝날 수 있습니다. 이 문제를 해결하려면 위에 설명 된 Sailboat에 추가하거나 Wind

2

변수로 지정하십시오. 제안 - 배와 요트가 환경에 존재합니다. 보트는 환경에 어떤 영향을 받는지 알고 있습니다.

class Environment 
{ 
public: 
    Wind wind; 
}; 

class Object { 
public: 
    virtual void calcForces(Environment const&); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(Environment const& env); // can ignore the wind 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Environment const& env) override; // will use env.wind in calculation 
}; 

이제 환경을 수정하고 환경의 모든 개체에 힘을 계산하도록 요청할 수 있습니다. 보트, 요트 또는 돌고래 여부.

+0

객체 지향 접근법 때문에 매우 좋은 제안이고 확실히 바람직합니다. 그러나 그가 잘못하고있는 것이 무엇인지에 대해 설명하지 않기 때문에 미래에 비슷한 문제에 직면하고 있다면 그렇게 도움이되지 않습니다. – Rafiwui