이 일반 상속/가상 기능 수 없습니다,하지만 당신은 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} }
{
}
두 솔루션은, 특히 구현이 파생 클래스 내에서 아니라고, 자신의 단점이를 범위 지정 문제 (예 : 구현에서 파생 클래스의 비공개 멤버에 액세스)
아니요, 피할 수 없습니다. 이유? 헤더 파일의 사용자 (컴파일러 포함)는 클래스가 비 추상 클래스임을 어떻게 알 수 있습니까? –
그것은 C++의 가장 큰 약점 중 하나입니다. 컴파일 속도가 훨씬 느려집니다. pimpl 관용구와 같은이 문제를 줄이기위한 해결책이 있지만 여전히 문제입니다. – ikh
@ikh :이 "문제"와 컴파일 속도 사이의 관계는 무엇인지 명확하지 않습니다. –