免费的做网站,可建网站,创业平台名称,被执行人信息查询【学习笔记】重载和重写的注意事项
特征重载#xff08;Overloading#xff09;重写#xff08;Overriding#xff09;发生位置同一个类中/父子类之间也可以父子类之间目的扩展功能#xff08;增加新的参数组合#xff09;修改父类行为参数列表必须不同必须相同返回类型…【学习笔记】重载和重写的注意事项
特征重载Overloading重写Overriding发生位置同一个类中/父子类之间也可以父子类之间目的扩展功能增加新的参数组合修改父类行为参数列表必须不同必须相同返回类型可相同或不同但不能仅依赖返回类型区分必须相同隐藏关系父子类之间子类隐藏父类同名方法需 using 声明子类覆盖父类方法关键字无需特殊关键字C: overrideoverride 明确表明派生类中的函数是在重写基类的虚函数
重载
class Calculator {
public:// 方法重载参数类型不同int add(int a, int b) { return a b; }double add(double a, double b) { return a b; }// 方法重载参数数量不同int add(int a, int b, int c) { return a b c; }
};
重写
class Animal {
public:virtual void makeSound() {std::cout Animal makes a sound std::endl;}
};class Dog : public Animal {
public:// 重写父类方法void makeSound() override {std::cout Dog barks std::endl;}
};注意点父子的重载
父子类的重载需要注意一个问题函数隐藏规则子类中的 ProcessRequest 会隐藏父类中的所有同名函数无论参数列表是否相同。
class Base {
public:virtual bool ProcessRequest(int id) { return true; }
};class Derived : public Base {
public:bool ProcessRequest(int id, bool verbose) { return false; } // 参数不同是重载
};
结果呈现
int main() {Derived d;// 正确调用 Derived::ProcessRequest(int, bool)d.ProcessRequest(42, true); // 错误无法通过 Derived 对象调用 Base::ProcessRequest(int)// d.ProcessRequest(42); // 编译错误// 正确通过基类指针调用 Base::ProcessRequest(int)Base* b d;b-ProcessRequest(42); // 输出 truereturn 0;
} ● 通过 Derived 对象无法直接调用 ProcessRequest(int)除非使用 using Base::ProcessRequest。
● 通过 Base 指针调用 ProcessRequest(int) 时实际执行的是 Base 类的方法而非 Derived 的重载版本。
解决方法使用using引入父类的方法。
class Derived : public Base {
public:using Base::ProcessRequest; // 引入父类的 ProcessRequest(int)// 子类的重载版本bool ProcessRequest(int id, bool verbose) { return false; }
};
总结
但是一般重写是在父子类中重载是在同一个类中。但是需要注意父子重载过程中存在的父类函数隐藏的问题。