fork download
  1. #include <stdio.h>
  2.  
  3. enum EmptyConstructor
  4. {
  5. _EmptyConstructor
  6. };
  7.  
  8. class Foo
  9. {
  10. int m_ValueFoo;
  11. public:
  12. Foo() : m_ValueFoo( 0 ){ printf("Foo()\n"); }
  13. Foo(EmptyConstructor e){(void)e;}
  14. void Initialize( int value )
  15. {
  16. m_ValueFoo = value;
  17. }
  18. int GetValue( void ) const { return m_ValueFoo; }
  19. };
  20.  
  21. class A
  22. {
  23. Foo m_ValueA;
  24. public:
  25. A(){ printf("A()\n"); }
  26. A(EmptyConstructor e) : m_ValueA(e) {}
  27. void Initialize( int value )
  28. {
  29. m_ValueA.Initialize( value );
  30. }
  31. int GetValueA( void ) const { return m_ValueA.GetValue(); }
  32. };
  33.  
  34. class B : public A
  35. {
  36. Foo m_ValueB;
  37. public:
  38. B(){ printf("B()\n"); }
  39. B(EmptyConstructor e) : A(e), m_ValueB(e) {}
  40. void Initialize( int value )
  41. {
  42. m_ValueB.Initialize( value );
  43. A::Initialize( value ); // 基底クラスを後から初期化
  44. }
  45. int GetValueB( void ) const { return m_ValueB.GetValue(); }
  46. };
  47.  
  48. class C : public B
  49. {
  50. Foo m_ValueC_1;
  51. Foo m_ValueC_2;
  52. public:
  53. C(){ printf("C()\n"); }
  54. C(EmptyConstructor e) : B(e), m_ValueC_1(e), m_ValueC_2(e) {}
  55. void Initialize( int value )
  56. {
  57. m_ValueC_2.Initialize( value ); // 2番目のメンバ変数の初期化
  58. B::Initialize( value ); // 基底クラスの初期化
  59. m_ValueC_1.Initialize( value ); // 1番目のメンバ変数の初期化
  60. }
  61. int GetValueC1( void ) const { return m_ValueC_1.GetValue(); }
  62. int GetValueC2( void ) const { return m_ValueC_2.GetValue(); }
  63. };
  64.  
  65. int main( void )
  66. {
  67. // デフォルトコンストラクタによる初期化
  68. {
  69. C c;
  70. printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
  71. }
  72. // 自由な初期化(Initialize関数)
  73. {
  74. C c( _EmptyConstructor );
  75. c.Initialize( 9 );
  76. printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
  77. }
  78. // べつの引数で。
  79. {
  80. C c( _EmptyConstructor );
  81. c.Initialize( 1111 );
  82. printf( "%d,%d,%d,%d\n", c.GetValueA(), c.GetValueB(), c.GetValueC1(), c.GetValueC2() );
  83. }
  84. return 0;
  85. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
Foo()
A()
Foo()
B()
Foo()
Foo()
C()
0,0,0,0
9,9,9,9
1111,1111,1111,1111