的比方说,我们有以下层次:如何防止调用基实现的方法
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