那麼,而你的問題的直接回答是沒有。您可以使用一些技巧來獲得您的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