的比方說,我們有以下層次:如何防止調用基實現的方法
class Abstract
{
public:
virtual void foo() = 0;
};
class Base : public Abstract
{
public:
virtual void foo() override; //provides base implementation
};
class Derived : public Base
{
public:
virtual void foo() override; //provides derived implementation
};
如果Base::foo()
曾經被稱爲Derived
對象,對象將不同步和數據將被破壞的。它繼承了Base
的數據結構及其操作,但需要執行其他操作,因此只調用Base::foo()
將省略這些額外的操作,結果Derived
的狀態將被破壞。
因此,我想,以防止Base
實施foo
所以這直接調用:
理想情況下,應該給我的某些種類的編譯時錯誤。或者什麼都不做或以其他方式被阻止
但是這可能是我違反規則的多態性和應該使用成分代替但這需要一個額外的大量打字...
在'Base'中,'protected:'而不是'public:'方法有問題嗎?此外,這似乎也是一個體面的候選人,可以在'Base'中重新聲明爲純虛擬的,*並提供一個'Base'實現,這並不常見,但確實發生了。如果「派生」應該總是被執行,那麼它似乎是一個不錯的選擇。 – WhozCraig
@WhozCraig我不知道我可以提供純虛擬方法的實現。如果它被那些繼承它的實現重新實現,那麼這會阻止實現永遠被調用嗎? – Resurrection
@Resurrection no,這就是爲什麼'Base :: foo'上的'protected'會進來。但是它*做的*是強制派生類仍然提供覆蓋,同時還提供了一個通用的Base實現,它們可以在不拋棄的情況下調用一個額外的成員功能進入不適。 – WhozCraig