2014-08-30 4 views
0

안녕하세요 저는 상속 클래스의 가상 함수를 사용하여 헤더 파일에 들어가는 클래스 프로토 타입에 포함시키지 않고 사용하고 싶습니다. 이 일을 할 수있는 방법이 있습니까?어떻게 든이 방법으로 상속을 사용할 수 있습니까

class Base { 
public: 
    virtual void func() = 0; 
}; 

class Derived : public Base { 
public: 

}; 

void Derived::func() { 
return; 
} 

내가 생각하는 것입니다. 내가 실제로 작업하고있는 경우 많은 함수가있을 수 있으며 모든 추가 함수를 사용하여 클래스 선언을 포기하고 싶지는 않습니다.

+4

아니요, 피할 수 없습니다. 이유? 헤더 파일의 사용자 (컴파일러 포함)는 클래스가 비 추상 클래스임을 어떻게 알 수 있습니까? –

+0

그것은 C++의 가장 큰 약점 중 하나입니다. 컴파일 속도가 훨씬 느려집니다. pimpl 관용구와 같은이 문제를 줄이기위한 해결책이 있지만 여전히 문제입니다. – ikh

+0

@ikh :이 "문제"와 컴파일 속도 사이의 관계는 무엇인지 명확하지 않습니다. –

답변

1

이 일반 상속/가상 기능 수 없습니다,하지만 당신은 FUNC의 구현 주입 수 :

// header file 

#include <functional> 

class Base { 
public: 
    Base(std::function<void()> func_impl) 
     : m_func_impl{ std::move(func_impl) } 
    { 
    } 

    void func() { m_func_impl(); } 

private: 
    std::function<void()> m_func_impl; 
}; 

class Derived : public Base { 
public: 
    Derived(); 
}; 

// implementation file 

static void Derived_func() 
{ 
    // your implementation of func 
} 

Derived::Derived() 
    : Base{ Derived_func } 
{ 
} 

당신은 pimpl 관용구를 사용하여 동일한 작업을 수행 할 수 있습니다. 이 모든 방법이 std::function을 가진 피할 수 있지만, 보조 클래스 hierachy가 필요합니다 : 당신이 ADRESS하는 방법에 대해 생각해야하므로

// header file 

#include <memory> 

class Base { 
public: 
    struct Impl 
    { 
     virtual ~Impl() {} 
     virtual void func() = 0; 
    }; 

    Base(std::unique_ptr<Impl> impl) 
     : m_impl{ std::move(impl) } 
    { 
    } 

    void func() { m_impl->func(); } 

private: 
    std::unique_ptr<Impl> m_impl; 
}; 

class Derived : public Base { 
public: 
    Derived(); 
}; 

// implementation file 

class Derived_Impl : public Base::Impl 
{ 
    virtual void func() override 
    { 
     // your implementation of func 
    } 
}; 

Derived::Derived() 
    : Base{ std::unique_ptr <Impl> {new Derived_Impl} } 
{ 
} 

두 솔루션은, 특히 구현이 파생 클래스 내에서 아니라고, 자신의 단점이를 범위 지정 문제 (예 : 구현에서 파생 클래스의 비공개 멤버에 액세스)

관련 문제