多态
调用一个接口,表现出不同的形态
静态多态:(重载)在编译时就已经确定了调用方法/函数
动态多态: 在编译时无法确定,在运行时才能确定。(指针)
静态多态
虚函数:作用是通过基类指针可以指向子类的同名成员
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、子类指针---》基类: