こんにちは。コンストラクタに関して教えてください。

コンストラクタからインスタンスメソッドを呼び出す場合には下記のような
注意が必要ですが、そもそもそんな注意が必要な仕様にしてまで呼び出せる
ようにする必要があるのでしょうか?
単純に呼び出せないようにすれば良いのではないでしょうか?


■コンストラクタからのインスタンスメソッド呼び出しの注意
◇C++等の場合
  メソッドがサブクラスでオーバーライドされていても、サブクラスの
  メソッドではなく自クラスのメソッドが呼び出される。

◇Ruby,Java等の場合
  メソッドがサブクラスでオーバーライドされている場合、サブクラスの
  メソッドが呼び出されるが、サブクラスでのコンストラクトが完了して
  いない可能性がある。


■例
◇C++の場合
・ソースプログラム
  #include <string>
  #include <iostream>

  class SuperClass
  {
      std::string x_;
    public:
      SuperClass(const std::string &x):
          x_(x)
      {
          method();
      }
      virtual ~SuperClass() {}

      virtual void method() const {
          std::cout << "in SuperClass#method\n";
          std::cout << x_ << "\n";
      }
  };

  class SubClass: public SuperClass
  {
      std::string y_;
    public:
      SubClass(const std::string &y):
          SuperClass(y),
          y_(y + "def")
      {
      }
      virtual ~SubClass() {}

      virtual void method() const {
          std::cout << "in SubClass#method\n";
          std::cout <<  y_ << "\n";
      }
  };

  int main()
  {
      SubClass obj("abc");
      obj.method();
  }

・実行結果
  in SuperClass#method
  abc
  in SubClass#method
  abcdef

◇Rubyの場合
・ソースプログラム
  #/usr/local/bin/ruby

  class SuperClass
    def initialize(x)
      @x = x
      method()
    end

    def method
      puts 'in SuperClass#method'
      puts @x
    end
  end

  class SubClass < SuperClass
    def initialize(y)
      super(y)
      @y = y + 'def'
    end

    def method
      puts 'in SubClass#method'
      puts @y
    end
  end

  obj = SubClass.new('abc')
  obj.method

・実行結果
  in SubClass#method
  nil
  in SubClass#method
  abcdef


--
pegacorn