클래스 Base
에는 컨트롤이 없으며 모든 클래스 함수에 대한 멤버 포인터를 허용하는 함수가 있습니다. 그것은 다음과 같이 사용하기위한 것입니다 : (내가 알지도에 대한 관심을 둘 것을) Base
저장이 포인터를포인터 - 투 - 멤버 함수 및 다중 상속
class Derived : public Base {
void bindProperties() {
Base::bindProperty("answer", &Derived::getAnswer);
}
int getAnswer() const { return 42; }
};
어떤 방법을 나중에 나를 Derived::get("answer")
호출 할 수 있습니다 (물론,이 단순화 된 상황이다). 다중 상속은 우리가 단지를 상속하는 데 사용할만큼, 나쁘지 않다 생각
class ICalculator {
virtual int getAnswer() const;
};
template<class T>
class LifeAndUniverseCalculator : public T, public ICalculator {
virtual int getAnswer() const /* override */ { return 42; }
void bindProperties() {
T::bindProperty("answer", &ICalculator::getAnswer); // (*)
}
};
:
아래쪽 측면은 우리가 과거에 현명하게 시도하고, 다중 상속을 사용했다고한다 하나의 "구체적인"기본 클래스 만 가질 수 있습니다. 때때로 우리는 (나는 또한에 대한 액세스 권한이없는) 파생 클래스 중 하나에서 때때로 Base
에서 파생 싶어하기 때문에
템플릿은 - 그 관련성이없는 경우 당신은 내가 대신 T
앤 드롭의 Base
을 쓴 척 수 템플릿.
어쨌든, 지금 데 문제는, 내가
LifeAndUniverseCalculator calc;
calc.bindProperties();
int answer = calc.get("answer");
를 호출 할 때 내가 횡설수설를 얻을 수 있다는 것입니다. 나는 vtable을에 포인터 뭔가있을 수 있습니다 생각, 그래서 당신이 낸로합니다 (올바르게 오프셋, 그러나 명확하게 작동하지 않는 계산 것이라고 기대하고
T::bindProperty("answer", &LifeAndUniverseCalculator::getAnswer);
에 의해
T::bindProperty("answer", &ICalculator::getAnswer);
를 교체 시도 지금 쯤이면, 나는이 모든 것이 어떻게 작동하는지에 대해 두 번째 추측하고 있습니다.)
는 다중 상속을 제거하고 (그것이 유일한 파생 클래스의)
이 모든 래퍼 함수를 만드는
LifeAndUniverseCalculator
직접ICalculator
에 최선을 다하는하기 등나는, 일부 옵션의 생각
ICalculator
내용은LifeAndUniverseCalculator
입니다.LifeAndUniverseCalculator::Calculator_GetAnswer
은ICalculator::GetAnswer
으로 전화하면됩니다.
- 알고 내가 좋아하는 것
, 간단한 방법으로 (*)로 표시된 선을 수정하는 방법이 있나요?
- 그렇지 않은 경우 가장 좋은 해결책은 무엇입니까 (위의 대안 중 하나 또는 다른 것)?
- 내가
Base
의 작성자에게 연락 할 수 있고 기꺼이 수업을 변경할 수 있다면 내 설명에 따라 합당한 말을 할 수 있다면 구체적으로 물어야 할 것이 무엇인지 물어보십시오.
MCVE가 필요하면 on IDEOne 문제가 있다고 생각됩니다.하여 MCVE에서
MCVE에서 멤버 포인터가 A 형 멤버에 대한 포인터 함수로 정의 된 함수 유형으로 캐스트되는 것이 문제가 될 수 있습니까? 반면 캐스팅되는 함수는 A가 아닌 멤버입니까? – jwimberley
@jwimberley 지금까지 헤더 파일을 훑어 보면 알 수 있듯이 실제로 'Unknown'멤버를 가리키고 있지만 문제가 변경되지 않는다고 생각합니다 (아이디어는 아마도 'Unknown'이 0 바이트 임) . – CompuChip
프로그램에 정의되지 않은 동작의 터미널 케이스가 있습니다. 이 방법으로는 공용체를 사용할 수 없으며 시도하면 충돌이 완전히 예상됩니다. –