-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.cpp
More file actions
80 lines (66 loc) · 3.1 KB
/
main.cpp
File metadata and controls
80 lines (66 loc) · 3.1 KB
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 <cstdlib>
#include <iostream>
/* Polymorphism is one of the most powerful features of OOP. In short,
it means that a pointer that points to a derived class is
type-compatible with a pointer to its base class. This works
particularly well in conjunction with virtual functions. */
class base {
public:
void nfun() { std::cout << "base.nfun" << std::endl; } // This is a normal function.
virtual void vfun() { std::cout << "base.vfun" << std::endl; } // This is a virtual function.
virtual void vfun2() { std::cout << "base.vfun2" << std::endl; } // This is a virtual function.
};
class derived : public base {
public:
void nfun() { std::cout << "derived.nfun" << std::endl; } // Overwrites base.nfun.
void vfun() { std::cout << "derived.vfun" << std::endl; } // Reimplemented in derived, automatically virtual too.
// vfun2() just stays virtual from base
};
class dderived : public derived {
public:
void vfun2() { std::cout << "dderived.vfun2" << std::endl; } // Ovewrites vfun2 from base.
};
// base class can be passed by reference, yet function still accepts derived objects
void callvfun(base& b) {
b.vfun();
}
int main(int argc, char* argv[])
{
base b;
derived d;
dderived dd;
base* pb; // This is a pointer to base type.
std::cout << "Base pointer to base class: " << std::endl;
pb = &b;
pb->nfun(); // This calls base::nfun.
pb->vfun(); // This calls base::vfun.
pb->vfun2(); // This calls base::vfun2.
std::cout << std::endl;
std::cout << "Base pointer to derived class: " << std::endl;
pb = &d; // Now p points to d. Although p was declared as pointer to base this is possible.
pb->nfun(); // This calls base::nfun because pb is of type base* and nfun is a normal function.
pb->vfun(); // This calls derived::vfun because vfun is virtual.
pb->vfun2(); // Still calls base::vfun2 because it was not reimplemented in derived.
std::cout << std::endl;
std::cout << "Derived pointer to derived class: " << std::endl;
derived* pd = &d;
pd->nfun(); // This calls derived::nfun because pd is of type derived* and nfun is a normal function.
pd->vfun(); // This calls derived::vfun because vfun is virtual.
pd->vfun2(); // Still calls base::vfun2 because it was not reimplemented in derived.
std::cout << std::endl;
std::cout << "Base pointer to dderived class: " << std::endl;
pb = ⅆ
pb->nfun(); // Calls derived::nfun.
pb->vfun(); // Calls derived::vfun because vfun is virtual.
pb->vfun2(); // Calls dderived::vfun2 because vfun2 is virtual.
std::cout << std::endl;
std::cout << "DDerived pointer to dderived class: " << std::endl;
dderived* pdd = ⅆ
pdd->nfun(); // Calls derived::nfun as this was defined last in the hierarchy in derived.
pdd->vfun(); // Calls derived::vfun because vfun is virtual.
pdd->vfun2(); // Calls dderived::vfun2.
std::cout << std::endl;
std::cout << "Pass by reference: " << std::endl;
callvfun(d); // will call derived.vfun
return EXIT_SUCCESS;
}