以前没认真分辨这几个概念的区别,今天记录一下。
转载:为什么const对象只能调用const成员函数,而不能调用非const成员函数? - 阿瞒123 - 博客园 (cnblogs.com)
重点:
1.重载只能在一个类中。
2.重写只能在子类和派生类中。
3.隐藏只能是子类和派生类中。
4.重载可以重载const(很有意思),非常量对象也可以调用常成员函数,但是如果有重载的非常成员函数则会调用非常成员函数。
1.重载:就是在一个类中声明同名和返回值类型相同的函数,但参数不同
2.重写(覆盖):就是定义虚函数,子类继承重写
3.隐藏:就是派生类定义了一个和基类同名和返回值的函数。但基类的函数不定义成虚函数
4.const重载(静态)
原因:通常我们在类中定义一个函数,实际上传入的是 void Get(Base* this),这代表一个指向Base对象的指针this被传入到了Get函数中。而但对象被定义成const 时候,比如const Base a,则调用函数的时候函数中必须要有 void Get(const Base* const this),相当于void Get(Base* this) const。这就是为什么常对象只能调用常成员函数的原因。但是非常量对象可以调用常量函数,因为编译器会自动先转换为常量对象。