2014-12-01 2 views
-1

아래와 같이 클래스와 파생물을 사용하면 기본 클래스 메서드가 자체 형식이 아닌 파생 된 형식의 개체 참조를 구문 적으로 반환 할 수있는 방법이 있습니다 나는 그 방법들을 함께 묶을 수 있습니까?메서드 체인 기본 클래스 메서드를 호출 한 후 파생 된 클래스 메서드

해당 개체 Aa1,a2 파생 AD이 방법 ad1 어떻게 하나 AD_instance.a1().a2().ad1();의 유효한 방법 체인을 만드는 방법에 대한 갈 것이라고 추가합니다 방법을 가정합시다?

아래 두 클래스가 있습니다. 실제로 수행중인 작업을 무시하면 메서드 체인이 유일한 중요한 부분입니다.

이렇게 연결됩니다.

workerA A(0); 
A.Start().Detach().other_method_i_want_to_chain(); 
+0

광고는 a1과 a2를 오버라이드해야합니다. –

답변

1

당신은 기본 클래스 버전에 전달 파생 클래스에서 적절한 과부하를 만들 수 있지만, 자신의 객체를 반환 :

class workerA { 
    // ... 
    workerA& Start() { 
     this->AsyncWorker::Start(); 
     return *this; 
    } 
    workerA& Detach() { 
     this->AsyncWorker::Detach(); 
     return *this; 
    } 
    // ... 
}; 
+0

반환을 (무효 *)로 변환 할 수있는 방법이 있습니까? 기본 클래스가 파생 된 멤버에 대해 알지 못하는 경우에도 호출자의 컨텍스트가 똑같습니다. 호출자는 파생 클래스의 인스턴스입니다. – MatUtter

+0

컴파일러는 사용할 수있는 함수를 결정하기 위해 표현식의 정적 (컴파일 타임) 유형을 알아야합니다. 기본 클래스 함수에서 파생 형식에 대한 참조를 기본 참조로 반환하면 컴파일러는 파생 형식이 아닌 것을 알 수 없습니다. 이 동작은 다른 언어 (예 : 스몰 토크 또는 불쾌감을주는 C [++])와는 달리 런타임시 멤버를 조회합니다. C++에 이러한 기능이 내장되어 있지 않습니다. –

0

희망이 문제가 당신을 위해 좀 더 명확에게 있습니다.

#include <iostream> 

struct Base 
{ 
    virtual Base& foo() = 0; 
}; 

struct Derived : Base 
{ 
    virtual Derived& foo() 
    { 
     std::cout << "Came to Derived::foo()\n"; 
     return *this; 
    } 

    void bar() 
    { 
     std::cout << "Came to Derived::bar()\n"; 
    } 

}; 

int main() 
{ 
    Derived derived; 
    derived.foo().bar(); // OK. From the interface of Derived, foo() 
         // returns a Derived&. 
    Base& base = derived; 
    base.foo().bar(); // Not OK. From the interface of Base, foo() 
         // returns a Base&. 

    return 0; 
} 
관련 문제