c++面向对象的一些理解

面向对象编程时,我们必须抽象出一个共同的基类,让它含有一些基本的属性,这样我们可以方便扩展派生类,也减少用到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关键词来实现,抽象方法是可以有实现的。

猜你喜欢

转载自blog.csdn.net/qq842447820/article/details/83076719