Für alle anderen:
Angenommen man hat zwei Klassen (A und B), wobei B eine spezialsisierte Variante von A ist:
|
C-/C++-Quelltext
|
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
|
struct A
{
int x;
explicit A( int val )
: x( val )
{}
virtual void foo() const
{
std::cout << "A::foo()\n";
}
};
struct B : public A
{
explicit B( int val )
: A( val )
{}
void foo() const
{
std::cout << "B::foo()\n";
}
};
|
Nun gibt es z.B. eine Funktion die ein Objekt vom Typ A als Parameter an nimmt:
|
C-/C++-Quelltext
|
1
2
3
4
|
void test( A obj )
{
obj.foo();
}
|
Diese Funktion nimmt aber nicht nur A Objekte an, sondern auch B Objekte können ohne weiteres übergeben werden:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
int main()
{
A obj1( 10 );
B obj2( 20 );
test( obj1 );
test( obj2 );
std::cin.get();
}
|
Die Ausgabe ist nun folgende:
A::foo()
A::foo()
Also nicht unbedingt das was gewollt war.
Mit anderen Worten: Alles was ein B-Objekt ausmacht wird also abgeschnitten und wir können nurnoch mit einem A-Objekt arbeiten.
Abhilfe verschaffen hier Referenzen oder Zeiger (Referenzen als C++ Weg
).
|
C-/C++-Quelltext
|
1
2
3
4
|
void test( const A& obj )
{
obj.foo();
}
|
A::foo()
B::foo()
Und schon klappts auch mit den Nachbarn! :-)