C++ syntax of derivation
1 | class base |
1 | class Derived: access-specifier Base |
the base class
is also called the super class
. The class that derives from the base, also known as the derived class
, can be called the subclass
.
e.g. a simple inheritance hierarchy
demolist_10.1
1 |
|
neither of the two derived class seems to define a method Swim()
but we have managed to successfully invoke in main()
. This is because Swim()
is a public member of base class Fish
that they inherit form.
access Specifier Keyword protected
protected
, like public
and private
, is also an access specifier. When class attributes or functions are declared as protected
, you are effectively making it accessible to classes derive (and friends), simultaneously making it inaccessible to everyone else outside the class, including main()
.
e.g. A better class using protected based on demolist_10.1 .
demolist_10.2
modifying line 4-15
1 | class Fish |
base classes initialization
using initialization lists and invoking the appropriate base class constructor via the constructor of the derived class.
Syntax as shown in the following code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Base
{
public:
Base(int someNumbers)//overloaded constructor
{
//use someNumbers
}
};
class Derived: public Base
{
public:
Derived: Base(25);//instantiate Base with argument 25
{
//derived class constructor code
}
};
derived class constructor with initialization lists
demolist_10.3
1 |
|
Fish
now has a constructor that take a default parameter initializing Fish::isWaterFreshFish
. Thus the only possibility to create an object of Fish
is via providing it a parameter that initialized the protected member. This way class Fish
ensures that the protected member doesn't contain a random value.
derived class overriding base class's method
class derived
overrides the method in class base
. syntax as shown in following code:
1 | class Base |
Thus, if method DoSomething()
were to invoked using instance of Derived
, then it wouldn't invoke the functionality in class Base
.
Derived class
overriding the method in Base class
demolist10_4
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
using namespace std;
class Fish
{
protected:
bool isFreshWaterFish;
public:
Fish(bool isFreshWater) : isFreshWaterFish(isFreshWater) {}
void Swim()
{
if (isFreshWaterFish)
cout << "swim in lake" << endl;
else
cout << "swim in ocean" << endl;
}
};
class Tuna : public Fish
{
public:
Tuna() : Fish(false) {}
void Swim()
{
cout << "Tuna swim" << endl;
}
};
class Crap : public Fish
{
public:
Crap() : Fish(true) {}
void Swim()
{
cout << "Crap swim" << endl;
}
};
int main()
{
Tuna MyLunch;
Crap MyDinner;
cout << "Lunch ";
MyLunch.Swim();
cout << "Dinner ";
MyDinner.Swim();
return 0;
}
The code demonstrates that the implementation of Fish::Swim()
in the base class Fish
is overridden by the identical function Swim()
defined by the classes Tuna
and Carp
that derive from Fish
. The only way to invoke Fish::Swim()
is by having main()
use the scope resolution operator (::)
in explicitly invoking Fish::Swim()
.