面向对象编程时,我们必须抽象出一个共同的基类,让它含有一些基本的属性,这样我们可以方便扩展派生类,也减少用到switch和if这些语句。
比如说我们要用switch,来实现不同情况的分类,在c++中我们完全可以通过派生类来进行划分。
第一个方法通过虚函数来进行分类:
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public://函数我们一般先定义为public
Fruit(){}
~Fruit(){}
virtual void Say(){
cout << "i am orange" << endl;
}
virtual void Eat(){
cout << "eat orange" << endl;
}
};
class Apple :public Fruit//这里一定不要忘了public
{
public:
Apple(){}
~Apple(){}
void Say(){
cout << "i am apple" << endl;
}
void Eat(){
cout << "eat apple" << endl;
}
};
int main(){
Fruit* f = new Fruit();
f->Say();
f->Eat();
f= new Apple();
f->Say();
f->Eat();
return 0;
}
2.通过构造函数来构造出不同对象进行分类:
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
Fruit(string name){
mName = name;
}
Fruit(){
mName = "orange";
}
~Fruit(){}
void Say(){
cout << "i am "+mName << endl;
}
void Eat(){
cout << "eat "+mName << endl;
}
private:
string mName;
};
class Apple :public Fruit
{
public:
Apple():Fruit("apple"){}
~Apple(){}
};
int main(){
Fruit* f = new Fruit();
f->Say();
f->Eat();
Apple* a = new Apple();
a->Say();
a->Eat();
system("pause");
return 0;
}
两者对比:
用虚函数的话,我们只需要声明一个基类指针,就可以访问到所有派生类的对象。如果父类和子类的方法中没有通用点,可以用虚函数进行分类。(重写实现多态)
而只用构造函数进行分类的话,我们就需要定义派生类指针,需要让派生类的构造函数继承于基类的有参构造方法。如果父类和子类的方法中有通用点,可以直接用构造方法来进行区分,好处就是不用重写方法。(重载区分不同对象)
这个例子中属于有通用点的,因为除了它们的名字之外都是相同的,我们可以用构造函数进行区分,但是很多时候方法里面的实现是没有共同点的。
注意:继承的时候一定要继承public, class Apple :public Fruit。
c++中没有接口,只能有抽象类来模拟接口,在c++中abstract并不是一个关键字,只要类里面有纯虚函数,这个类就是抽象类。
有虚函数的才叫重写,没有虚函数的就是重定义。
https://blog.csdn.net/liuxiao2030/article/details/53868592
c#中是有接口interface,里面的方法是不可以有实现的。
c#中也有抽象类和抽象方法,利用abstract关键词来实现,抽象方法是可以有实现的。