Index: /trunk/abdev/BasicCompiler_Common/error.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/error.cpp	(revision 350)
+++ /trunk/abdev/BasicCompiler_Common/error.cpp	(revision 351)
@@ -216,4 +216,7 @@
 	if(num==300) lstrcpy(msg,"内部エラー");
 
+	// ベースライブラリ不整合
+	if( num == 400 )	sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord );
+
 #else
 	////////////////////
Index: /trunk/abdev/BasicCompiler_Common/include/Method.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 350)
+++ /trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 351)
@@ -51,6 +51,8 @@
 	}
 
+	virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0;
+
 	virtual bool IsAbstract() const = 0;
-	virtual void Override() = 0;
+	virtual void SetAbstractMark( bool isAbstractMark ) = 0;
 	virtual bool IsVirtual() const = 0;
 	virtual bool IsConst() const = 0;
@@ -103,11 +105,13 @@
 	}
 
+	virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
+
 	virtual bool IsAbstract() const
 	{
 		return isAbstract;
 	}
-	virtual void Override()
-	{
-		isAbstract = false;
+	virtual void SetAbstractMark( bool isAbstract )
+	{
+		this->isAbstract = isAbstract;
 	}
 	virtual bool IsVirtual() const
@@ -150,14 +154,23 @@
 
 public:
+
+	// コンストラクタ
 	StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
 		: CMethod( pUserProc, accessibility )
 	{
 	}
+
+	// コピーコンストラクタ
+	StaticMethod( const StaticMethod &staticMethod );
+
+	// デストラクタ
 	StaticMethod()
 	{
 	}
 
+	virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ){SetError();return false;}
+
 	virtual bool IsAbstract() const{SetError();return false;}
-	virtual void Override(){SetError();}
+	virtual void SetAbstractMark( bool isAbstract ){SetError();}
 	virtual bool IsVirtual() const{
 		return false;
@@ -190,5 +203,11 @@
 
 public:
+	// コンストラクタ
 	Methods();
+
+	// コピーコンストラクタ
+	Methods( const Methods &methods );
+
+	// デストラクタ
 	~Methods();
 
@@ -197,6 +216,6 @@
 	void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
 
-	// オーバーライド
-	bool Override( UserProc *pUserProc, Prototype::Accessibility accessibility );
+	// オーバーライドのための検索
+	CMethod *FindForOverride( const UserProc *pUserProc );
 
 	const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
Index: /trunk/abdev/BasicCompiler_Common/include/Procedure.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Procedure.h	(revision 350)
+++ /trunk/abdev/BasicCompiler_Common/include/Procedure.h	(revision 351)
@@ -220,4 +220,16 @@
 	}
 
+	// オーバーライド用に関数同士が等しいかどうかをチェックする
+	bool IsEqualForOverride( const UserProc *pUserProc ) const
+	{
+		if( this->GetName() == pUserProc->GetName()						// 名前空間及び名前が等しい
+			&& this->Params().Equals( pUserProc->Params() )				// パラメータが等しい
+			&& this->returnType.Equals( pUserProc->returnType ) )		// 戻り値が等しい
+		{
+			return true;
+		}
+		return false;
+	}
+
 	bool IsMacro() const
 	{
Index: /trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 350)
+++ /trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 351)
@@ -382,4 +382,10 @@
 	SetSuperClassActualTypeParameters( actualTypeParameters );
 
+	// インターフェイスを引き継ぐ
+	BOOST_FOREACH( ::Interface *pInterface, inheritsClass.GetInterfaces() )
+	{
+		interfaces.push_back( new ::Interface( *pInterface ) );
+	}
+
 	return true;
 }
@@ -447,7 +453,25 @@
 	}
 
-	interfaces.push_back( new ::Interface( &interfaceClass ) );
-
+	::Interface *pDestInterface = new ::Interface( &interfaceClass );
+
+	interfaces.push_back( pDestInterface );
+
+
+	/////////////////////////////////////////////////////////////////
+	// 基底クラスのメソッドからインターフェイスメソッドを再実する
+	/////////////////////////////////////////////////////////////////
+	BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
+	{
+		CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() );
+		if( pMethodForOverride )
+		{
+			pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
 	// キャストメソッドを追加（内部コードは自動生成すること）
+	/////////////////////////////////////////////////////////////////
 	{
 		// Function Operator() As ITest
@@ -474,4 +498,5 @@
 	}
 
+
 	return true;
 }
@@ -600,16 +625,14 @@
 
 	//メソッド
-	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ){
+	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
+	{
 		//基底クラスと重複する場合はオーバーライドを行う
 		if( pMethod->GetInheritsClassPtr() ) continue;
 
-		if( pMethod->GetUserProc().GetName() == temporary ){
-			if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
-				&& pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
-			{
-				//関数名、パラメータ、戻り値が合致したとき
-				SetError(15,pUserProc->GetName().c_str(),nowLine);
-				return;
-			}
+		if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
+		{
+			//関数名、パラメータ、戻り値が合致したとき
+			SetError(15,pUserProc->GetName().c_str(),nowLine);
+			return;
 		}
 	}
@@ -619,11 +642,9 @@
 
 	// メソッドのオーバーライド
-	if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) )
-	{
-		// オーバーライドが行われた場合
-		if( !isOverride )
-		{
-			SetError(127,NULL,nowLine);
-		}
+	CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc );
+	if( pMethodForOverride )
+	{
+		pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+		pUserProc->SetMethod( pMethodForOverride );
 		return;
 	}
@@ -633,11 +654,9 @@
 		BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
 		{
-			if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) )
+			CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
+			if( pMethodForOverride )
 			{
-				// オーバーライドが行われた場合
-				if( !isOverride )
-				{
-					SetError(127,NULL,nowLine);
-				}
+				pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+				pUserProc->SetMethod( pMethodForOverride );
 				return;
 			}
@@ -1026,4 +1045,16 @@
 			if(pMethod->IsAbstract()){
 				return true;
+			}
+		}
+	}
+
+	// インターフェイスのvtbl
+	BOOST_FOREACH( const ::Interface *pInterface, interfaces )
+	{
+		BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+			if(pMethod->IsVirtual()){
+				if(pMethod->IsAbstract()){
+					return true;
+				}
 			}
 		}
@@ -2021,5 +2052,7 @@
 		if( !pStringClass )
 		{
-			SmoothieException::Throw();
+			SetError(400, "System.String", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pStringClass;
@@ -2035,5 +2068,7 @@
 		if( !pObjectClass )
 		{
-			SmoothieException::Throw();
+			SetError(400, "System.Object", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pObjectClass;
@@ -2049,5 +2084,7 @@
 		if( !pInterfaceInfo )
 		{
-			SmoothieException::Throw();
+			SetError(400, "ActiveBasic.Core.InterfaceInfo", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pInterfaceInfo;
Index: /trunk/abdev/BasicCompiler_Common/src/Method.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 350)
+++ /trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 351)
@@ -4,11 +4,56 @@
 
 
+bool DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
+{
+	if( this->IsVirtual()
+		&& !this->IsAbstract()
+		&& isOverrideModifier == false )
+	{
+		// Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
+		SetError(127,NULL,cp);
+	}
+
+	//メンバ関数を上書き
+	this->SetUserProcPtr( pUserProc );
+	this->SetAbstractMark( false );
+
+	if( !this->IsVirtual() )
+	{
+		// オーバーライドミス
+		SetError(136,NULL,cp);
+	}
+	if(this->GetAccessibility() != accessibility )
+	{
+		SetError(128,NULL,cp);
+	}
+
+	return true;
+}
+
+
+StaticMethod::StaticMethod( const StaticMethod &staticMethod )
+{
+	// 静的メソッドがコピーコンストラトされることは想定しない
+	SetError();
+}
+
 Methods::Methods()
 {
 }
+
+// コピーコンストラクタ
+Methods::Methods( const Methods &methods )
+{
+	BOOST_FOREACH( CMethod *pMethod, methods )
+	{
+		this->push_back( new DynamicMethod( dynamic_cast<DynamicMethod &>(*pMethod) ) );
+	}
+}
+
 Methods::~Methods()
 {
 	Methods &methods = *this;
-	BOOST_FOREACH( CMethod *pMethod, methods ){
+	BOOST_FOREACH( CMethod *pMethod, methods )
+	{
 		delete pMethod;
 	}
@@ -26,5 +71,5 @@
 }
 
-bool Methods::Override( UserProc *pUserProc, Prototype::Accessibility accessibility )
+CMethod *Methods::FindForOverride( const UserProc *pUserProc )
 {
 	//メソッドのオーバーライド
@@ -32,29 +77,10 @@
 	BOOST_FOREACH( CMethod *pMethod, methods )
 	{
-		if( pMethod->GetUserProc().GetName() == pUserProc->GetName() )
+		if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
 		{
-			if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
-				&& pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
-			{
-				//メンバ関数を上書き
-				pMethod->SetUserProcPtr( pUserProc );
-				pMethod->Override();
-
-				if( !pMethod->IsVirtual() )
-				{
-					// オーバーライドミス
-					SetError(136,NULL,cp);
-				}
-				if(pMethod->GetAccessibility() != accessibility )
-				{
-					SetError(128,NULL,cp);
-				}
-
-				pUserProc->SetMethod( pMethod );
-				return true;
-			}
+			return pMethod;
 		}
 	}
-	return false;
+	return NULL;
 }
 
