Mar*_*cin 13 c++ inheritance abstract-class pure-virtual
让我们说我们有一个具体的class Apple
.(可以实例化Apple对象.)现在,有人来自class Peach
Apple 并从Apple中获取摘要.它是抽象的,因为它引入了一个新的纯虚函数.Peach的用户现在被迫从中派生并定义这个新功能.这是一种常见的模式吗?这是正确的吗?
样品:
class Apple
{
public:
virtual void MakePie();
// more stuff here
};
class Peach : public Apple
{
public:
virtual void MakeDeliciousDesserts() = 0;
// more stuff here
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们有一个具体的class Berry
.有人class Tomato
从贝瑞那里得到一个摘要.它是抽象的,因为它覆盖了Berry的虚拟函数之一,并使其成为纯虚拟函数.Tomato的用户必须重新实现之前在Berry中定义的功能.这是一种常见的模式吗?这是正确的吗?
样品:
class Berry
{
public:
virtual void EatYummyPie();
// more stuff here
};
class Tomato : public Berry
{
public:
virtual void EatYummyPie() = 0;
// more stuff here
};
Run Code Online (Sandbox Code Playgroud)
注意:名称是人为的,并不反映任何实际代码(希望如此).在撰写这个问题时,没有任何成果受到伤害.
来自Apple的Re Peach:
来自Berry的Re Tomato:
Juice()
- 强加某些要求并作出某些承诺.派生类的实现Juice()
必须不再需要,并且不会少.然后DerivedTomato IS-A Berry和只知道Berry的代码是安全的.可能,您将通过记录DerivedTomatoes必须调用来满足最后的要求Berry::Juice()
.如果是这样,请考虑使用模板方法:
class Tomato : public Berry
{
public:
void Juice()
{
PrepareJuice();
Berry::Juice();
}
virtual void PrepareJuice() = 0;
};
Run Code Online (Sandbox Code Playgroud)
现在,番茄IS-A浆果很有可能与植物学期望相反.(例外情况是派生类的实现会PrepareJuice
施加超出其强加的额外前提条件Berry::Juice
).
在我看来,这似乎是一个糟糕的设计的迹象.如果你想从一个封闭的库中获取一个具体的定义并扩展它并从中分出一堆东西,可能会被强制,但那时我会认真考虑关于Encapsulation over Inheritance的指导原则.如果你可以封装的话,你可能应该.
是的,我想的越多,这是一个非常糟糕的主意.