您好我想使用继承类的虚函数,而不必将其包含在最终将进入头文件的类原型中。有没有办法做到这一点?
class Base {
public:
virtual void func () = 0;
};
class Derived : public Base {
public:
};
void Derived::func () {
return;
}
我在想什么。在我实际使用的情况下,我可能会使用大量虚函数来处理任何函数,并且我不想使用所有额外函数来阻止类声明。
答案 0 :(得分: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
,但需要二级类层次结构:
// 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} }
{
}
这两种解决方案都有其缺点,最明显的是实现不在派生类中,因此您必须考虑如何解决范围问题(例如,在您的实现中访问派生类的私有成员)。