首页IT科技重载覆盖重定义(关于重载 隐藏 覆盖)

重载覆盖重定义(关于重载 隐藏 覆盖)

时间2025-04-29 02:52:23分类IT科技浏览3450
导读:重载关系...

重载关系

一组函数要重载,必须处在同一个作用域zhong ,而且函数名字相同,参数列表不同

代码1中的Base中的 show() 和show(int) 属于重载

代码2中的Base中的 show() 和Derive中的show()不属于重载

隐藏的关系(主要是指作用域隐藏)

在继承结构当中,派生类的同名成员,把基类的同名成员给隐藏掉了

例如代码2中的 Derive中的show() 和Base()中的show() ,show(int) 是隐藏关系

代码1

class Base { public: Base(int data=10):ma(data){ cout<<"Base"<<endl; } void show(){cout<<"Base Show()"<<endl;} void show(int){cout<<"Base Show(int)"<<endl;} ~Base(){cout<<"~Base()"<<endl;} protected: int ma; }; class Derive : public Base { public: Derive(int data=20):Base(data),mb(data){ cout<<"Derive"<<endl; } ~Derive(){cout<<"~Derive()"<<endl;} private: int mb; }; int main(){ Derive d(20); d.show(); //正常调用基类show() d.show(100); //正常调用基类show(int) return 0; }

代码2

class Base { public: Base(int data=10):ma(data){ cout<<"Base"<<endl; } void show(){cout<<"Base Show()"<<endl;} void show(int){cout<<"Base Show(int)"<<endl;} ~Base(){cout<<"~Base()"<<endl;} protected: int ma; }; class Derive : public Base { public: Derive(int data=20):Base(data),mb(data){ cout<<"Derive"<<endl; } void show(){cout<<"Derive Show()"<<endl;} ~Derive(){cout<<"~Derive()"<<endl;} private: int mb; }; int main(){ Derive d(20); d.show(); //调用子类show() d.show(100);//调用报错 报错信息 "Derive::show()函数不接受1个参数" // 即 Derive中的 show()方法把Base中的 show 和show(int)都给隐藏掉了 // 所以d.show() 没问题,调用的是派生类的show(),但是d.show(100)报错了,因为 // 父类的show()和show(int)都被隐藏了,而派生类Derive中没有 show(int)方法所以报错了 // 如果想调用父类的show(int) 要这样写 d.Base.show(100); return 0; }

基类对象 -> 派生类对象

类型由上向下转 NOT OK

Base b(10);

Derive d(20);

d=b;// NOT OK

派生类对象 ->基类对象

类型由下向上转 OK

Base b(10);

Derive d(20);

b=d;//OK

关于重载 隐藏 覆盖

派生类指针(引用) ->基类指针 类型由下向上转 OK

Base b(10);

Derive d(20);

Base *pb =&d;// OK 如下图, 基类指针只能访问到基类那一部分的成员,所以是安全的

关于重载 隐藏 覆盖

代码3

class Base { public: Base(int data=10):ma(data){ cout<<"Base"<<endl; } void show(){cout<<"Base Show()"<<endl;} void show(int){cout<<"Base Show(int)"<<endl;} ~Base(){cout<<"~Base()"<<endl;} protected: int ma; }; class Derive : public Base { public: Derive(int data=20):Base(data),mb(data){ cout<<"Derive"<<endl; } void show(){cout<<"Derive Show()"<<endl;} ~Derive(){cout<<"~Derive()"<<endl;} private: int mb; }; int main(){ Base b(10); Derive d(20); Base *pb =&d; pb->show(); //调用的是基类的 show pb->show(100);//调用的是基类的 show(int) ((Derive *)pb)->show(); //强转后 调用的是派生类的 show }

基类指针(引用) -> 派生类对象 类型由上向下转 NOT OK

Base b(10);

Derive d(20);

Derive *pb =&b;// NOT OK pb指针能够访问的区域超过了实际对象b的内存块           ,危险访问

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
AUSTOj4 小程序使用vuex(yolov5部署+微信小程序前端展示)