bosthhe1 / cpushpush

0 stars 0 forks source link

多态的初时 #23

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

多态是指一个函数有多个形态,比如说交换函数swap

void swap(int a, int b){}
void swap(double a,double b){}

这种是静态的多态,函数重载,看起来调用同一个函数,但是功能不同

bosthhe1 commented 1 year ago

多态的重点是动态的多态 动态的多态满足的条件是

(一) 父类的引用或者指针去调用同一个函数,传递的对象不同,会调用不同的函数
(二)调用的函数必须满足函数重写
           函数重写的条件
           1,三同(函数名,返回值,参数类型相同),同时是虚函数

Q}(P FB20BS%T4 OB7B3@UE 如果不满足以上全部条件,就按照各自的类型去调用

bosthhe1 commented 1 year ago

有两个特殊的函数重写就是析构函数和协变,所有的析构函数在编译器的底层都会将名字替换为destructor(),虽然在上层看来析构函数的名字不同,但是底层析构函数的名字是相同的,虽然析构函数不需要返回值,但是我们认为也是相同的返回条件,我们存在这样一种情况需要使用到析构函数的重写,对于new了一个父类和一个子类对象,将父类和子类都交给父类指针管理,在释放父类的时候,可以完成析构,但是在释放子类的时候,是需要去调用子类的析构函数 IQ`@8J FCGMZQSXDVU8%%A9 我们可以看到在构成多态的时候,子函数交给父类的指针管理,析构的时候,还是会去调用子类的析构函数, 如果不构成多态,就是去调用各自类型的函数。 协变是指当我们的父类函数的返回值为父类型的指针或引用,子类型的返回值为子类型的指针或者引用的时候,也构成重写,虽然返回类型不同,但是会特殊处理

bosthhe1 commented 1 year ago

多态的虚函数可以只写父类,因为子类会继承父类的的虚函数,这种继承相当于将子类构成重写的函数,替换成虚函数,但是函数里面的内容不发生改变,父类继承给子类,子类也可以再次继承个子类的子类,只需要父类写了虚函数,其他地方都可以不写,但是个人建议都写上,增加代码的可读性