mirror of https://github.com/xfarrow/lasd.git
82 lines
1.3 KiB
C++
82 lines
1.3 KiB
C++
#include<iostream>
|
||
using namespace std;
|
||
/*
|
||
ereditarietà a diamante:
|
||
A <-- B
|
||
A <-- C
|
||
B <-- D
|
||
C <-- D
|
||
*/
|
||
|
||
void nonVirtualInheritance();
|
||
void virtualInheritance();
|
||
int main(){
|
||
//nonVirtualInheritance();
|
||
virtualInheritance();
|
||
return 0;
|
||
}
|
||
|
||
void nonVirtualInheritance(){
|
||
class A{
|
||
public:
|
||
int size = 7;
|
||
};
|
||
|
||
class B : public A{
|
||
public:
|
||
int b;
|
||
};
|
||
|
||
class C : public A{
|
||
public:
|
||
int c;
|
||
};
|
||
|
||
class D : public B, public C{
|
||
public:
|
||
int d;
|
||
};
|
||
|
||
/*
|
||
Adesso B ha una copia di A, C ha una copia di A, D ha una copia di B e una
|
||
copia di C. Implica che D ha due copie di A.
|
||
Se provo a stampare size, cosa succede?
|
||
*/
|
||
D obj;
|
||
//cout<<obj.size<<endl; //request for member ‘size’ is ambiguous
|
||
|
||
cout<<obj.B::size<<endl;
|
||
cout<<obj.C::size<<endl;
|
||
}
|
||
|
||
void virtualInheritance(){
|
||
class A{
|
||
public:
|
||
int size = 7;
|
||
};
|
||
|
||
class B : virtual public A{
|
||
public:
|
||
int b;
|
||
};
|
||
|
||
class C :virtual public A{
|
||
public:
|
||
int c;
|
||
};
|
||
|
||
class D : public B, public C{
|
||
public:
|
||
int d;
|
||
};
|
||
|
||
D obj;
|
||
cout<<obj.size; // adesso posso stampare tranquillamente size
|
||
|
||
/*
|
||
Questo è possibile grazie al fatto che B e C ereditano A in modo virtuale,
|
||
ovverosia, c'è solo un'istanza A condivisa tra B e C.
|
||
https://www.cprogramming.com/tutorial/virtual_inheritance.html
|
||
*/
|
||
}
|