C++面向对象,虚函数,纯虚函数,抽象类

面向对象

C++与C最大的区别,就是C++可以面向对象编程。所谓面向对象,就是将实体抽象为对象,类就是同种类的对象的集合,如动物是一个类,狮子老虎熊猫是其中的对象。类由数据和方法构成。数据就是字面意思,比如动物的数据可以是年龄,体长,是否食肉等(数据不是数字)。方法是可以实现具体功能的函数,比如输出年龄,或者和另一个动物打一架。

#include<iostream>
using namespace std;
class animal{
public:
	animal(string a){name.assign(a);}
	void show(){cout<<"年龄是"<<age<<endl;}
	void fight(animal b);
private:
	string name;
	int age, length;
	bool vegetarian;
};//这里要分号

面向对象的三大特性

封装:将数据和方法封装在类里,保证了数据的安全性,并且使编程结构化,需要修改时更加明了。
继承:对已有的类增加或部分修改其数据或方法,来定义一个新的类,这个新的类叫做派生类(子类),旧的类叫基类(父类)。
多态:同一个操作(调用方法)对不同的对象可导致不同的行为。多态性允许将子类类型的指针赋值给父类类型的指针变量,此时调用该变量中的方法可以直接调用子类中定义的方法。C++中多态性通过虚函数实现。

	class parent{//父类parent
		...
	};//不要忘了分号
	class son: public parent{//子类son
		...
	};//虽然编译器会提醒

虚函数

虚函数是允许子类重新定义的函数,将子类指针赋予父类变量,通过该变量调用虚函数执行的是子类中的定义。在类中定义方法时在前面加virtual就使该函数变为虚函数,子类重写父类中声明的虚函数时,即使前面不用virtual声明,也是虚函数。

#include<iostream>
using namespace std;//这个分号也别忘
class father {//父类father
public:
	virtual void fun() { cout << "father" << endl; }
};
class son : public father {//子类son
public:
	void fun() { cout << "son" << endl; }
};
class grandson : public son {//孙子类grandson
public:
	void fun() { cout << "grandson" << endl; }
};
int main(){
	father* f;
	son s;
	grandson g;
	f = &g;
	f->fun();//调用grandson中的函数
	f = &s;
	f->fun();//调用son中的函数
	return 0;
}

运行结果:

grandson
son

纯虚函数、抽象类

当基类表示一种抽象概念,不具体建立对象时,将其某一成员函数定义为虚函数

virtual void fun()=0;

这样的虚函数称为纯虚函数,其并不返回值0。事实上,纯虚函数不能被调用,只能调用子类中对应的重写过的函数。含有纯虚函数的类就是抽象类。抽象类不能建立对象,也不能用作参数类型、函数返回类型,但可以定义指针和引用,其指针可以指向它的派生类。抽象类的派生类需要实现基类中的纯虚函数,不然则该派生类依然为抽象类。

覆盖、隐藏

父类与子类有同名方法,且其参数相同,父类定义若有virtual,则该函数是虚函数,父类方法可以被子类覆盖
父类与子类有同名方法,且其参数相同,定义时没有virtual,则使用的变量或指针是什么类,就调用什么类的方法,与具体赋值无关。此时,子类方法可以隐藏父类。

#include<iostream>
using namespace std;
class father {//父类father
public:
	void fun() { cout << "father" << endl; }
};
class son : public father {//子类son
public:
	void fun() { cout << "son" << endl; }
};
class grandson : public son {//孙子类grandson
public:
	void fun() { cout << "grandson" << endl; }
};
int main() {
	father* f;
	son s;
	grandson g;
	f = &g;
	f->fun();//虽然f赋的值是grandson类型的指针,但仍调用father中的方法
	s.fun();//调用son中的方法
	return 0;
}

运行结果:

father
son
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值