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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| // illustration de "Class Hierarchy Showing Virtual Base Classes"
//
// A
// / \
// B B
// | |
// C D
// \ /
// E
//
#include <iostream>
#include <cassert>
struct A {
A(int a) : a_(a) {}
// ctr par défaut avec assertion pour forcer à appeler A(int)
// depuis les classes finales
A() { assert(false && "Wrong compilation path"); }
virtual ~A() {}
void print_a() const { std::cout << "a="<<a_ << std::endl;}
private:
int a_;
};
struct B : virtual A {
B(int b) : b_(b) {}
virtual ~B() {}
void print_b() const { std::cout << "b="<<b_ << std::endl;}
private:
int b_;
};
struct C : B {
C(int bc, int c) : B(bc), c_(c) {}
virtual ~C() {}
void print_c() const { std::cout << "c="<<c_ << std::endl;}
private:
int c_;
};
struct D : B {
D(int bd, int d) : B(bd), d_(d) {}
virtual ~D() {}
void print_d() const { std::cout << "d="<<d_ << std::endl;}
private:
int d_;
};
struct E : C, D {
E(int a, int bc, int bd, int c, int d, int e)
: A(a), C(bc, c), D(bd, d), e_(e) {}
virtual ~E() {}
void print_e() const { std::cout << "e="<<e_ << std::endl;}
private:
int e_;
};
int main()
{
E e(1,2,3,4,5,6);
std::cout << "Depuis E:\n";
e.print_e();
e.print_d();
e.print_c();
// e.print_b(); // ambigüe
e.print_a();
std::cout << "Depuis D:\n";
D * d = &e;
d -> print_d();
// d -> print_c(); // evidemment pas accessible
d -> print_b();
d -> print_a();
std::cout << "Depuis C:\n";
C * c = &e;
// c -> print_d(); // evidemment pas accessible
c -> print_c();
c -> print_b();
c -> print_a();
// B * b = &e; // ambigüe
std::cout << "Depuis B via C:\n";
B * bc = c;
bc -> print_b();
bc -> print_a();
std::cout << "Depuis B via D:\n";
B * bd = d;
bd -> print_b();
bd -> print_a();
} |
Partager