父类指针和子类指针的步长

父类指针和子类指针的步长

1620858785306

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
#define  _CRT_SECURE_NO_WARNINGS 
#include <iostream>

using namespace std;

class Parent
{
public:
Parent(int a)
{
this->a = a;
}

virtual void print()
{
cout << "Parent::print() " << a << endl;
}
protected:
int a;
};

class Child :public Parent{
public:
Child(int a) :Parent(a)
{

}

virtual void print()
{
cout << "Child :: Print() " << a <<endl;
}
private:
int b;
};

int main(void)
{
Child array[] = {Child(0), Child(1), Child(2) };
// array[0] array[1] array[2]

Child *cp = &array[0];
Parent *pp = &array[0];


cp->print(); //Child::
pp->print(); //Child::发生多态

cout << "------" << endl;

cp++; //Child::12
//pp++;//8
pp = cp;

cp->print();
pp->print();

cout << " ----- " << endl;


int i = 0;
for (i = 0, cp = &array[0], pp = cp; i < 3; i++, cp++, pp =cp) {
pp->print();
}

return 0;
}
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
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


using namespace std;


class Fu
{
public:
Fu();
Fu(int ta): a(ta) {};
~Fu();
virtual void print() { cout << "Fu a = "<< a << endl; }
private:
int a;
};

class Zi : public Fu
{
public:
Zi();
Zi(int a, int tb) :Fu(a) ,b(tb){};
virtual void print() { cout << "Zi b = " << b << endl; }
~Zi();

private:
int b;
};

Zi::Zi()
{
}

Zi::~Zi()
{
}

Fu::Fu()
{
}

Fu::~Fu()
{
}

int main(char *argv[], int argc)
{
Zi zi[] = { Zi(100,200),Zi(300,400),Zi(500,600) };

Fu * pFu = zi;
/*
会崩溃,因为(pFu + i) == (pFu + sizeof Fu) 而不是(pFu + sizeof Zi)

for (int i = 0; i < 3; i++)
{
(pFu + i)->print();
}
*/

//解决方法
Zi * zi1[] = { new Zi(1,2),new Zi(3,4), new Zi(5,6), new Zi(7,8) };

for (int i = 0; i < sizeof(zi1) / sizeof(Zi *); i++)
{
pFu = zi1[i];
pFu->print();
}
return 0;
}