随笔——多态与虚函数

//多态与虚函数
#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关键字,也会自动成为虚函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值