C++面向对象编程
本文会记录以前学习面向对象编程(object-oriented programming, OOP)忽略的一些点。
静态成员变量/函数
静态成员变量/函数其实都不属于某一个类,而是全局空间,有点像加了个命名空间而已
同名函数的关系
- 重载(overload):相同作用域;函数名相同;参数列表不同(参数类型/参数个数不同);返回类型随意。 注意避免隐式类型转换。
int add(int a,int b);
long add(int a,int b,int c);
- 覆盖(override):不同作用域下(分别在父类和子类中);函数名相同;参数列表列表相同;返回类型相同;基类函数必须有虚函数;父类和子类的访问限定可以不同。
class Base
{
virtual void sayhi(int a,int b);
};
class Derived : public Base
{
void sayhi(int a,int b) override;
}
- 隐藏(hiding):不同作用域下(分别在父类和子类中);函数名相同;除覆盖的同名函数都是隐藏关系,即只显示子类函数
struct Base
{
void foo(int x) const {}
};
struct Derived : public Base
{
void foo(const std::string& s) {}
};
int main()
{
Derived d;
d.foo("abc");
d.foo(123); // Will not compile! Base::foo is hidden!
}
虚函数
虚函数开销见这里,双重内存访问对性能要求极高的程序还是很大影响的
参考资料
- C++中同名函数之间的关系,https://blog.csdn.net/zhuoya_/article/details/81194386
- Reason for C++ member function hiding, https://stackoverflow.com/questions/11923890/reason-for-c-member-function-hiding