C++ 在实现抽象类的类中定义额外的特定于实现的函数

C++ 在实现抽象类的类中定义额外的特定于实现的函数,c++,abstract-class,abstract,abstraction,C++,Abstract Class,Abstract,Abstraction,假设我正在使用函数eat()创建一个抽象类Fruit,我想让几个不同的类实现它。但是,对于Kiwi类,我还想创建一个函数peel(),它没有在我的抽象类中定义 在实现抽象类的类中生成额外函数是一种不好的做法吗? 我知道我可以将它添加到抽象类中,让它在不使用它的类中不做任何事情,但是如果我有很多其他类,它在其中就没有用处了 在实现抽象类的类中生成额外函数是一种不好的做法吗 一点也不 假设我们有以下类别: 类水果 { 公众: virtual void Eat()=0;//纯虚拟函数使类抽象 } 浆果

假设我正在使用函数eat()创建一个抽象类Fruit,我想让几个不同的类实现它。但是,对于Kiwi类,我还想创建一个函数peel(),它没有在我的抽象类中定义

在实现抽象类的类中生成额外函数是一种不好的做法吗? 我知道我可以将它添加到抽象类中,让它在不使用它的类中不做任何事情,但是如果我有很多其他类,它在其中就没有用处了

在实现抽象类的类中生成额外函数是一种不好的做法吗

一点也不

假设我们有以下类别:

类水果
{
公众:
virtual void Eat()=0;//纯虚拟函数使类抽象
}
浆果类:公共水果
{
公众:
void Eat()重写
{/*吃浆果…*/}
}
猕猴桃类:公共水果
{
公众:
void Eat()重写
{/*吃猕猴桃…*/}
void Peel()
{/*剥猕猴桃…*/}
}
我们当然可以吃()我们遇到的任何
水果
,所以所有
水果
物体都可以吃是有道理的

在食用之前,你不会
Peel()
a
Berry
,因此不期望
Berry
可以
Peel()
ed。这对于以任何方式处理
Berry
对象的用户来说都是不必要的

Eat()
ing一个
Kiwi
之前,你应该先
Peel()
它,所以任何处理
Kiwi
对象的人都会期望
Peel()
函数可用,因此
Peel()
他们的
Kiwi
Eat()
之前

现在,让我们假设用户被蒙上眼睛,并给出一个
Fruit*someFruit
指针。他们不知道这是浆果还是猕猴桃,但无论如何,他们肯定可以试试吃,因为吃水果总是有意义的!如果
水果
实际上是一个
猕猴桃
,而他们没有
Peel()
,那么最好让
Kiwi::Eat()
函数抛出一个异常(
抛出“yuk!”
),或者优雅地处理这个意外用法


虽然这个例子是专门写的关于吃水果的,但我们通常可以假设,一个对象的用户只需知道它的类型,就知道该对象可以使用哪些函数。当用户不知道对象的类型时,最好执行一些错误检查来处理错误使用的函数。

在实现抽象类的类中创建额外的函数
不,这不是一个坏做法,而且是一件很自然的事<代码>将它添加到抽象类中,然后让它在不使用它的类中不做任何事情这(通常)是一种糟糕的做法;您可以看到它的一些示例,例如java中的迭代器:所有迭代器都有方法
remove
,这在许多情况下都没有实现。更好的方法是使用迭代器和可变迭代器(带有remove),就像Kotlin那样。