那么,而你的问题的直接回答是没有。您可以使用一些技巧来获得您的init
功能的保证电话。 比方说,你有下面的基类:
class Base
{
public:
virtual void init() = 0;
private:
bool initialized = false;
};
void Base::init()
{
std::cout << "Called from base!\n";
initialized = true;
}
及以下得出:
class Derived: public Base
{
friend class Enforcer<Derived>;
public:
void init() override
{
std::cout << "Called from derived!\n";
}
private:
Derived()
{
}
private:
using BaseClass = Base;
};
看私人构造函数和友元声明:您可以在不的帮助没有更多的创建这个类Enforcer
class(这一步并非真正需要,但它会真正强制Derived
类的任何用户使用Enforcer
)。现在,我们需要写Enforcer
类,那就是:
template<typename T>
class Enforcer: public T
{
public:
template<typename... Args>
Enforcer(Args&&... arg): T(std::forward<Args>(arg)...)
{
}
void init() override
{
T::init();
T::BaseClass::init();
}
};
在ideone整个例子。
是的,它有它的缺点(你需要添加一些额外的东西到Derived
类),但它在我看来非常整齐地解决了这个需求。
_“是否有强制执行纯虚函数来设置从基类继承的任何变量的选项?”_编号 –
您可以做的是在声明它时将bool成员设置为false(或true) (在基类中) – sop
可惜...无论如何,@πάνταῥεῖ - 感谢您的快速回答! – michelson