-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path39-Inheritance.cpp
More file actions
65 lines (51 loc) · 1.59 KB
/
39-Inheritance.cpp
File metadata and controls
65 lines (51 loc) · 1.59 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
//39-Inheritance
#include <iostream>
class O{
public:
O(){std::cout << "Interface constructor." << std::endl;}
virtual ~O(){std::cout << "Interface destructor." << std::endl;}
virtual O* create() const = 0;
virtual O* clone() const = 0; //virtual copy constructor.
};
class A: public O{
public:
A(){std::cout << "Base Class constructor." << std::endl;}
~A(){std::cout << "Base Class destructor." << std::endl;}
virtual void f() = 0; //pure virtual function should be implemented in derived class. otherwise it is also abstract.
virtual void g(){std::cout << "Base Class g function." << std::endl;}
};
class B: public A{
public:
B(){std::cout << "Derived Class constructor." << std::endl;}
~B(){std::cout << "Derived Class destructor." << std::endl;}
void f(){std::cout << "Derived Class f function." << std::endl;}
void g() override{std::cout << "Derived Class g function." << std::endl;}
B* clone() const{return new B(*this);}
B* create() const{return new B();}
int a{};
};
int main(){
//A a; //cannot declare A because it contains pure virtual function that makes A abstract class.
B b;
b.f();
b.g();
b.a = 10;
b.A::g(); //overrided base class function is called from derived class.
std::cout << std::endl;
A *p = new B();
p->f();
p->g();
p->A::g();
delete p;
std::cout << std::endl;
O *o = new B();
delete o;
std::cout << std::endl;
B *b1 = b.clone(); //calls copy constructor.
B *b2 = b.create(); //default constructor.
std::cout << "b1->a = " << b1->a << std::endl;
std::cout << "b2->a = " << b2->a << std::endl;
delete b1;
delete b2;
std::cout << std::endl;
}