虚函数
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 出来的内存