跳转到内容

C++/类

维基教科书,自由的教学读本
< C++

可以用class或struct关键字为开头定义类(class)。类可以有数据成员,也可以有函数成员。

访问说明符(access specifier)有3种:public、private、protected。在类定义内部使用访问说明符,其后的成员声明(member-declaration)都具有相应的访问属性,直至向下遇到新的访问说明符为止。

访问说明符也可以用在派生类声明的基类说明(base-specifier)时,指示继承的基类的成员的访问属性,相应为:

  • 公开继承(public inheritance):基类的公开成员、保护成员在派生类的访问属性不变;基类的私有成员不能被派生类访问。
  • 保护继承(protected inheritance):基类的公开成员、保护成员在派生类变为保护访问属性;基类的私有成员不能被派生类访问。
  • 私有继承(private inheritance):基类的公开成员、保护成员在派生类变为私有访问属性;基类的私有成员不能被派生类访问。

也可参见下表:

Access specifiers in the base class
private protected public
private inheritance The member is inaccessible. The member is private. The member is private.
protected inheritance The member is inaccessible. The member is protected. The member is protected.
public inheritance The member is inaccessible. The member is protected. The member is public.

C++的面向对象编程,支持函数重载、函数覆盖、名字隐藏:

  • 函数重载:在同一个作用域内,允许签名(signature)不同的函数共存。函数签名是由函数名字、形参的类型与顺序这些信息构成。即允许函数名相同但形参类型或顺序不同的函数共存。
  • 函数覆盖:在虚函数机制下,派生类可以在虚表的槽(slot)中覆盖签名相同的基类的成员函数。
  • 名字隐藏(name hide):如果基类与派生类有同名(即使签名不同)的成员函数,则该基类成员函数在派生类中不可见。即重载对于跨作用域是无效的。C++11以后可以用using base::memberFunc;这样的代码把基类成员函数提升为派生类的成员函数。名字隐藏的目的是避免改变基类实现可能影响到子类已经正常工作的代码出现未预料的行为。