c++ day 12虚函数,抽象类 智能指针

虚函数

C++中的虚函数的作用主要是实现了多态的机制 , 有了虚函数就可以在父类的指针或者引用指向子类的实例的前提下,然后通过父类的指针或者引用调用实际子类的成员函数。这种技术让父类的指针或引用具备了多种形态。

class teacher{
public:
    virtual void sayhi(){
        cout << "hello t" << endl;
    }
};
class stu: public teacher{
public:
    void sayhi(){
        cout << "hello s" << endl;
    }
};

int main(){
    teacher * t = new stu();
    t->sayhi();
    return 0;
}

如果在teacher 父类中 sayhi 方法 没有声明虚函数的话, 那么在main 中 指针 t 是调不到子类的 sayhi 方法的,如果在子类重写父类的方法的时候,父类没有将重写的方法声明为虚函数,那么,就是静态联编,静态联编调用的是当前类型下的方法,而不是子类的方法

虚函数的工作原理

给每一个对象添加一个隐藏指针成员,它指向一个数组,数组里面存放着对象中所有函数的地址。这个数组称之为虚函数表(virtual function table v-table) 。表中存储着类对象的虚函数地址。

当出现 父类类型 变量 是子类创建出来的时候, 如果该父类有虚函数, 那么,该对象中的虚函数表储存的虚函数就是子类重写父类中 父类 声明虚函数的方法,

override final =delete 关键字

override是在类继承中子类重写符类的方法时声明该方法是重写父类的方法, 如果程序员粗心将该方法名字写错了,那么,override 会出现语法错误,提醒程序员,(个人感觉作用不大)

class father{
public:
    virtual void run(){
        cout << "这是父类" << endl;
    }
};


class son : public father{
public:
   void run() override{ //表示重写父类的函数
        cout << "这是子类" << endl;
    }
};

final在一个类的定义中如果有final 那么,这个了将不可被继承, final 用在类的上面是声明该类是最终类,

class fatherfinal{ //表示该类是最终类,无法被继承
    
};

如果是用在 虚函数中,那么, 则声明该虚函数不可被重写

class father { 
    virtual void run() final{ //表示该方法时最终方法,无法被重写
        
    }
};
class son: public person{
    
    //编译错误,方法无法被重写。
    void run(){ 
        
    }
};

(注意,final和override主要是针对虚函数 只能用在虚函数上, 其他函数不能使用)

=delete可以用在各种函数上, 它的作用是告诉编译器,该函数不能被调用,如果作用在类的拷贝构造函数中的话就有点类似于python中的单例模式,只能有一份,,不允许复制

纯虚函数

纯虚函数就是没有函数体,同时在定义的时候,其函数名后面要加上“= 0” 即可。

抽象类

在一个类中只要有纯虚函数,那么这个了就是一个抽象类, 抽象类无法创建实例对象,只能是继承的子类创建,

抽象了类似于什么该类下的子类拥有的方法,如果,一个动物类,动物是有进食功能的,,于是,可以在这个动物抽象类中调用 eat 虚函数,然后 在子类中实现这个函数

#include "iostream"
using namespace std;
class zoology{
public:
    virtual void eat()=0;
};

class cat: public zoology{
public:
    void eat(){
        cout << "猫抓老鼠获取食物" << endl;
    }
};

class dog: public zoology{
public:
    void eat(){
        cout << "狗看家获取食物" << endl;
    }
};

如果一个子类继承了一个父类(父类是抽象类),那么子类就必须重写所有的纯虚函数,否则视子类为抽象类,因为继承体系下,等同于子类拥有了和父类一样的代码

指针

由于指针的申请是直接操控内存的,所以,指针的处理是和重要的,如果操作不当可能会导致程序崩溃

指针有一些潜在的问题,如,野指针,重复释放, 忘记释放(内存泄漏)

野指针,在创建指针变量的时候没有申请内存空间,所以指针会随机指向一块内存, 当随机指向的时候如果又用到了该指针,如,输出指针的内容,但是这个内存中的数据是不能直接输出的,那么,就会产生错误

重复释放程序试图释放已经释放过的内存,或者释放已经被重新分配过的内存,就会导致重复释放错误.

内存泄漏在程序运行结束后都没有释放的指针, 内存就不能够被回收,就造成了内存泄漏

智能指针

智能指针就是为了解决上面的问题的, 智能指针可以做到程序结束的时候能保证我们释放点new 出来的内存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值