类
class Fruit
{
public:
Fruit();
~Fruit();
Fruit(const &object);
virtual int getType();
virtual void method() =0;
protected:
void function();
private:
int type;
static string name
}
| 声明 | 描述 |
---|
虚函数 | 函数声明前加【virtual】关键字 | 子类
可
以
\color{red}{可以}
可以重新实现基类的虚函数,也
可
以
不
\color{red}{可以不}
可以不实现. |
纯虚函数 | 函数声明前加【virtual】关键字,函数声明后加【=0】 | 子类
必
须
\color{red}{必须}
必须重新实现基类的虚函数 |
构造函数 | 构造函数名为【类名()】 | |
析构函数 | 析构函数声明为【~类名()】 | |
共有成员 | 声明在【public】关键字之后 | |
受保护成员 | 声明在【protected】关键字之后 | |
私有成员 | 声明在【private】关键字之后 | |
静态成员 | 声明在【static】关键字之后 | |
覆盖override | | |
隐藏overwrite | | |
重载overload | | |
| public | protected | private |
---|
类内有权访问 | 是 | 是 | 是 |
类外有权访问(不是子类) | 是 | 否 | 否 |
子类有权访问 | 是 | 是 | 否 |
父类public成员在子类中的权限 | public | protected | private |
父类protected 成员在子类中的权限 | protected | protected | private |
父类private成员在子类中的权限 | private | private | private |
| 覆盖override | 重写overwrite | 重载overload |
---|
同一类中 | 否 (基类与子类中) | 否 (基类与子类中) | 函数重载,不需要在类中 |
不同类中 | 是 (基类与子类中) | 是 (基类与子类中) | 函数重载,不需要在类中 |
函数名必须相同 | 是 | 是 | 是 |
参数必须一致(包括参数类型和参数数量) | 是 | 是 | 否(参数类型或返回值类型
可
以
\color{red}{可以}
可以不同) |
参数能够不同 | 否 | 否 | 是 |
基类必须有【virtual】关键字 | 是 |
可
以
\color{red}{可以}
可以有,也
可
以
\color{red}{可以}
可以没有. | 重载是在同一个类中,不存在基类. |
拷贝构造函数
描述
拷贝构造函数调用的三种情形:
1) 一个对象以值传递的方式传入函数体;
void function(TestClass object)
{
}
2) 一个对象以值传递的方式从函数返回;
TestClass function()
{
return TestClass();
}
3) 一个对象需要通过另外一个对象进行初始化
TestClass objectA;
TestClass objectB = objectA;
TestClass *pObjectC = new TestClass(objectB);
深拷贝
描述
浅拷贝
描述
构造函数的调用顺序
C++构造函数按下列顺序被调用:
(1)任何虚拟基类的构造函数按照它们被继承的顺序构造;
(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
(3)任何成员对象的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数。
析构函数的调用顺序
(1)类自己的析造函数。
(2)任何成员对象的析构函数按照它们声明的顺序 逆序调用;
(3)任何非虚拟基类的析构函数按照它们被继承的顺序 逆序调用;
(4)任何虚拟基类的析构函数按照它们被继承的顺序 逆序调用;
继承
虚继承