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!
}

虚函数

虚函数开销见这里,双重内存访问对性能要求极高的程序还是很大影响的

参考资料