C++ 多态 虚函数

多态

调用一个接口,表现出不同的形态
静态多态:(重载)在编译时就已经确定了调用方法/函数
动态多态: 在编译时无法确定,在运行时才能确定。(指针)

静态多态

虚函数:作用是通过基类指针可以指向子类的同名成员
class Base:
{
	 vitrual  void show()//虚函数
	{
		cout<<"我是父类"<<endl;
	}
};
class Child:public Base
{
	void show()
	{
		cout<<"我是子类"<<endl;
	}
};
Child d;
Base* ps=&d;
ps->show();//输出:我是子类
ps->Base::show();//输出:我是父类

总结:若基类指针指向子类时,基类指针引用子类的方法(虚函数时),子类优先
若基类中定义为虚函数,该该基类中派生出的子类中同名方法都为虚函数了。

动态多态

#include<iostream>
#include<string.h>
using namespace std;

class people
{
protected:
	string name;
	char sex;
	short age;
public:
	people()
	{
		cout<<"people()"<<endl;
	}
	people(const char* n,char s,short a):name(n),sex(s),age(a)
	{
		cout<<"people(...)"<<endl;
	}
	virtual void show()
	{
		cout<<"show,people"<<endl;
	}
};

class student:public people
{
protected:
	float c;
public:
	student()
	{
		cout<<"student()"<<endl;
	}
	student(const char* n,char s,short a,float c):people(n,s,a),c(c)
	{
		cout<<"student(...)"<<endl;
	}
	void display()
	{
		cout<<"display,student"<<endl;
	}
	void show()
	{
		cout<<"show,student"<<endl;
	}
	
};
void output()
{
	p->show();
}
int main()
{

	people p("p",'m',20);
	people* p1=&p;
	cout<<p1->name<<endl;
	p1->show();
	student s;
	student* ps=&s;
	cout<<ps->name<<endl;
	ps->show();
	ps->display();
	
	
	people hx("hx",'m',20);
	student lxy;
	//lxy=hx;
	hx=lxy;
	

	people* p=NULL;//基类
	student* ps=NULL;//子类
	string* pstr=NULL;
	people zhq("zhq",'m',20);
	student cjx("cjx",'m',21,100);
	string str="abc";
	pstr=&str;
	p=&cjx;
	//ps=&zhq;报错
	
	people* p=NULL;
	p=&zhq;
//	p->show();
	p=&cjx;
//	cjx.show();
	p->show();//
	p->people::show();//

	return 0;
}

基类指针可以指向子类,但无法指向子类中新增函数,也无法调用子类中重写(覆盖)的同名函数,遂在基类函数前添加virtual使其成为虚函数,基类指针便可指向子类同名函数。若想指向基类中的函数,在在指向时添加people::域名即可。

通过基类指针p可以同时调用基类和子类的同名函数

1、对象之间赋值

 没有关系(不是继承关系)类型对象是不能直接赋值:
 student lz; 	
 string a="abc"; 	
 lz=a;//报错:
 运算只能识别基本类型,不能识别复杂类型
 具有关系: 	
 			基类对象=子对象     可以赋值
			子对象=基类对象	  不可以直接赋值

2、对象拷贝复制:调用拷贝构造器(实例化对象同时赋值同类对象)

student zzz=lz;//zzz调用是拷贝构造器

3、对象的赋值:(若类中没有显示的定义重载赋值运算符,就会系统默认定义赋值运算符)

 studetn abc; 	lz=abc; 
 //对象赋值:调用重载运算符(运算符只能识别基本类型)

4、对象指针:该对象指针只能引用类中的成员

5、对象指针指向不同对象类型:

没有关系的类型指针不能指向
student zhq;
string* ps=NULL;
ps=&zhq;	//错误:没有关系的类型指针不能指向

具有关系的指针:
	1、基类指针--》子类:
	2、子类指针---》基类:	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值