我想要运行的特定功能每当对象被构造,[...它]在转恰好调用虚函数,我想允许派生类的能力如果他们想要,可以覆
这可以,如果你愿意住有两个限制,可以轻松完成:
- 建设者在整个类层次结构必须是非公开的,因而
- 工厂模板类必须用于构造派生类。
这里,“特定功能”是Base::check
,虚拟功能是Base::method
。
首先,我们建立基类。它必须满足两个要求:
- 它必须与
MakeBase
,其检查类。我假设你想Base::check
方法是私人的,只能在工厂使用。如果它是公开的,当然你不需要MakeBase
。
- 构造函数必须受到保护。
https://github.com/KubaO/stackoverflown/tree/master/questions/imbue-constructor-35658459
#include <iostream>
#include <utility>
#include <type_traits>
using namespace std;
class Base {
friend class MakeBase;
void check() {
cout << "check()" << endl;
method();
}
protected:
Base() { cout << "Base()" << endl; }
public:
virtual ~Base() {}
virtual void method() {}
};
模板化CRTP工厂从一个基类,与Base
朋友派生,并因此先后获得了私人检查方法;它也可以访问受保护的构造函数以构建任何派生类。
class MakeBase {
protected:
static void check(Base * b) { b->check(); }
};
工厂类可以发出一个可读的编译时错误消息,如果您不小心使用它不是从Base
派生的类:
template <class C> class Make : public C, MakeBase {
public:
template <typename... Args> Make(Args&&... args) : C(std::forward<Args>(args)...) {
static_assert(std::is_base_of<Base, C>::value,
"Make requires a class derived from Base");
check(this);
}
};
派生类必须有一个受保护的构造:
class Derived : public Base {
int a;
protected:
Derived(int a) : a(a) { cout << "Derived() " << endl; }
void method() override { cout << ">" << a << "<" << endl; }
};
int main()
{
Make<Derived> d(3);
}
输出:
Base()
Derived()
check()
>3<
如果函数调用是构造派生类所必需的,并且是特定于该类的,那么听起来好像应该从派生类的构造函数中调用它。想要从一个技术上还不存在的对象调用方法并不是一个好主意。 –
那么我想运行的函数是一种运行时验证程序,以确保它们写出的派生类符合某些要求。它需要访问虚拟功能以检查它们是否正常工作。 –
在这种情况下,@ Jarod42提出的工厂方法可能是您最好的选择。 –