forked from hengqiali/AwesomeCpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main4.cpp
80 lines (62 loc) · 2.87 KB
/
main4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
using namespace std;
/****************************************
C++ 继承
1. 创建派生类时,会先调用基类构造函数,再调用派生类构造函数
2. 销毁派生类时,会先调用派生类析构,再调用基类析构
3. 析构函数需要定义为虚函数,这样在实现多态时才能调用子类的析构函数;否则只会调用父类的析构函数
非多态时,满足1和2
4. Fruit *f;不会调用构造函数
5.继承访问控制
基类中 继承方式 子类中
public & public继承 => public
public & protected继承 => protected
public & private继承 => private
protected & public继承 => protected
protected & protected继承 => protected
protected & private继承 => private
private & public继承 => 子类无权访问
private & protected继承 => 子类无权访问
private & private继承 => 子类无权访问
https://blog.csdn.net/helainthus/article/details/51452247
*****************************************/
class Fruit{
public:
Fruit(){ //构造函数,创建对象时自动调用
cout << "创建Fruit" << endl;
}
~Fruit(){ //前面带~,和名字和类名一样,代表是析构函数
cout << "销毁Fruit" << endl;
}
string getName();//先声明再实现
void setName(string n);//先声明再实现
private:
string name; //名字
double weight;//重量
string color; //颜色
int number; //个数
};//注意分号
string Fruit::getName(){ //::代表 作用域符,Fruit::getName 代表在Fruit类中的getName函数
return name;
}
void Fruit::setName(string n){
name = n;
}
/** Banana继承自Fruit **/
class Banana:public Fruit{ // :public Fruit 代表继承Fruit
public:
Banana(){cout << "创建Banana" << endl;};
~Banana(){cout << "销毁Banana" << endl;};
};
int main()
{
string name;
Fruit fru; //创建类对象fru,此时会自动调用构造函数
Banana ban;
cout << "子类会同时继承父类的构造函数和析构函数,以及public方法和变量" << endl;
cout << "Banana类虽然没有实现setName()和getName(),但是它继承了Fruit父类的这两个函数" << endl;
ban.setName("banana"); //类对象fru调用函数
name = ban.getName();
cout << "Banana's name = " << name << endl;
return 0;
} //在作用域结束后,fru对象会销毁掉,此时会自动调用构造函数