//多态与虚函数
#include<iostream>
using namespace std;
class A
{
public:
virtual void print()
{
cout<<"A"<<endl;
}
};
class B:public A
{
public:
virtual void print()
{
cout<<"B"<<endl;
}
};
void pri(A &r)
{
r.print();
}
int main()
{
A a;
B b;
pri(a);
pri(b);
}
/*
虚函数指的是在声明前加了virtual的函数。virtual关键字只能在类的定义中成员函数声明处使用。静态成员函数不能是虚函数。
包含虚函数的类被称为多态类。
*/
//多态差别
#include<iostream>
using namespace std;
class A
{
public:
virtual void fun()//声明多态
{
cout<<"A"<<endl;
}
};
class B:public A
{
public:
virtual void fun()//声明多态
{
cout<<"B"<<endl;
}
};
int main()
{
A a;B b;
A *pa=&a;
pa->fun();
pa=&b;
pa->fun();
}
//对比
#include<iostream>
using namespace std;
class A
{
public:
void fun()//没有声明多态
{
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void fun()//没有声明多态
{
cout<<"B"<<endl;
}
};
int main()
{
A a;B b;
A *pa=&a;
pa->fun();
pa=&b;
pa->fun();
}
/*
对于没有声明函数为多态,这种情况下,调用的函数是指针类型的函数,也就是指针是什么
类型,调用的就是那个类型的函数。声明多态后,调用的是指针指向类型的函数。
*/
//纯虚函数和抽象类
#include<iostream>
using namespace std;
class A
{
private:
int x,y;
public:
virtual void print()=0;//纯虚数
out()
{
cout<<x<<" "<<y<<endl;
}
};
int main()
{
//多态类不能生成独立对象
A a;//错误
A *pa=new A;//错误
A a[2];//错误
}
/*
纯虚数的写法 就是在函数声明后面加“=0”,不写函数体。纯虚函数是不存在的。引入纯虚函数是为
了方便实现多态,包含纯虚函数的类被成为多态类,多态类不能生成独立对象。如果一个类从抽象类
派生而来,那么当且仅当它对基类中的所有纯虚函数都进行覆盖并写出函数体,(包括空‘{}’结构体)
它才能成为非抽象函数。
*/
#include<algorithm>
#include<string.h>
#include<iostream>
#include<stdio.h>
using namespace std;
class staff
{
protected:
int x,y;
public:
virtual void shu()
{
cout<<"&&&"<<endl;
}
};
class teacher:public staff
{
private:
int z;
public:
virtual void shu()//多态。占用内存,4字节。
{
cout<<"***"<<endl;
}
};
int main()
{
staff *p;
p=new staff;
printf("%d\n",sizeof(*p));//输出内存字节
teacher *q;
q=new teacher;
p=q;
p->shu();
printf("%d\n",sizeof(*p));//输出内存字节
printf("%d\n",sizeof(*q));//输出内存字节
}
/*
基类指针指向派生类,它的内存不会改变,也就是说它虽然指向了派生类,但是它依然
无法调用基类中没有的东西。
*/
c++规定:只要基类中的某个函数被声明为虚函数,这派生类中同名函数,同参函数表的成员
函数即使前面不写virtual关键字,也会自动成为虚函数。