重写:1.在父子类中,子类重写父类函数 2.函数名同名 3.参数相同 4.父类的同名必须有virtual
重写是动态联编,根据或引用实际指向的对象决定调用哪个类的函数
多态:调用同名函数时,由于参数不同(重载)或由于所调用的对象(重写)不同造成调用结果不同
重载和重写的区别:1.范围不同 2.参数要求不一样(重载:参数不同 重写:参数必须一样) 3.virtual要求不同 4.重载是静态联编,重写是动态联编
重写的两种错误:
1.子类与父类函数名相同,参数相同,但是父类没有virtual,只能发生静态联编 //没有编译错误 但是达不到效果
2.子类与父类函数名相同,参数不同,都是静态联编
class Parent { public: Parent() { cout<<"Parent()"<<endl; this->privata_data =0; } Parent(int k) { this->privata_data =k; } virtual void show(int p) //加上virtual就是动态联编了 { cout<<"Parent:show"<<this->privata_data<<endl; } void setPrivatadata(int a) { this->privata_data = a; } int privata_data; }; class Sub:public Parent { public: Sub() { cout<<"Sub()"<<endl; this->name = " "; } Sub(const string &name,int k=0):Parent(k) { cout<<"Sub(const string &name,int k=0):Parent(k"<<endl; this->name = name; } void show(string &name) { cout<<"Sub:show"<<this->name<<endl; } ~Sub() { cout<<"~Sub()"<<endl; } private: string name; }; void showData(Parent *p) { p->show(); } int main(int argc, char *argv[]) { #if 1 Parent *p = new Sub;//父类指针指向子类对象 p->show();//静态联编,结果是调用父类的show函数 delete p; #endif #if 1 Parent *p = new Sub; p->show("xiaoli"); delete p; #endif }
参数不同,此时不管父类有没有virtual都会被屏蔽掉