Index: trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_CallProc.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler32/Compile_CallProc.cpp	(revision 347)
@@ -156,5 +156,5 @@
 		/////////////////////////////////
 		pMethod = NULL;
-		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethods().GetMethodPtr( pUserProc );
+		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
 		if( ! pMethod ){
 			//動的メソッドが取得できなかったときは静的メソッドを当たる
Index: trunk/abdev/BasicCompiler32/NumOpe.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/NumOpe.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler32/NumOpe.cpp	(revision 347)
@@ -232,5 +232,5 @@
 	GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
 
-	objClass.GetDynamicMethods().Enum( methodName, userProcs );
+	objClass.EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
 	if(userProcs.size()){
 		//オーバーロードを解決
Index: trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_CallProc.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler64/Compile_CallProc.cpp	(revision 347)
@@ -164,5 +164,5 @@
 		/////////////////////////////////
 		pMethod = NULL;
-		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethods().GetMethodPtr( pUserProc );
+		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
 		if( ! pMethod ){
 			//動的メソッドが取得できなかったときは静的メソッドを当たる
Index: trunk/abdev/BasicCompiler64/NumOpe.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/NumOpe.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler64/NumOpe.cpp	(revision 347)
@@ -233,5 +233,5 @@
 	GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
 
-	objClass.GetDynamicMethods().Enum( methodName, userProcs );
+	objClass.EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
 	if(userProcs.size()){
 		//オーバーロードを解決
Index: trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 347)
@@ -342,5 +342,5 @@
 
 	vector<const UserProc *> userProcs;
-	leftType.GetClass().GetDynamicMethods().Enum( methodName, userProcs );
+	leftType.GetClass().EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
 	if(userProcs.size()){
 		//オーバーロードを解決
Index: trunk/abdev/BasicCompiler_Common/hash.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/hash.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/hash.cpp	(revision 347)
@@ -90,5 +90,5 @@
 			else{
 				//動的メソッドから列挙
-				pobj_c->GetDynamicMethods().Enum( NestMember, subs );
+				pobj_c->EnumDynamicMethodsOfInterfaceMethods( NestMember, subs );
 			}
 
@@ -105,5 +105,5 @@
 
 		// 動的メソッド
-		compiler.pCompilingClass->GetDynamicMethods().Enum( name, subs );
+		compiler.pCompilingClass->EnumDynamicMethodsOfInterfaceMethods( name, subs );
 	}
 
@@ -157,5 +157,5 @@
 	if( pClass ){
 		vector<const UserProc *> userProcs;
-		pClass->GetDynamicMethods().Enum( methodName, userProcs );
+		pClass->EnumDynamicMethodsOfInterfaceMethods( methodName, userProcs );
 		if( userProcs.size() == 1 ){
 			return userProcs[0];
Index: trunk/abdev/BasicCompiler_Common/include/Class.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 347)
@@ -409,4 +409,7 @@
 	}
 
+	void EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
+	const CMethod *GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const;
+
 	const Methods &GetStaticMethods() const
 	{
@@ -493,5 +496,4 @@
 	int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
 	long GetVtblMasterListOffset() const;
-	void GenerateVTablePart( long &vtableDataTableOffset ) const;
 	void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset );
 	void GenerateFullVTables();
Index: trunk/abdev/BasicCompiler_Common/include/Method.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/include/Method.h	(revision 347)
@@ -204,3 +204,9 @@
 	virtual void Enum( const char *methodName, vector<const UserProc *> &subs ) const;
 	virtual void Enum( BYTE idOperatorCalc, vector<const UserProc *> &subs ) const;
-};
+
+	// 仮想メソッドの個数を取得
+	int GetVtblNum() const;
+
+	// vtblを生成
+	void GenerateVTablePart( long &vtableDataTableOffset ) const;
+};
Index: trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 347)
@@ -665,4 +665,32 @@
 }
 
+void CClass::EnumDynamicMethodsOfInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
+{
+	// 動的メソッド
+	GetDynamicMethods().Enum( methodName, subs );
+
+	// インターフェイス メソッド
+	BOOST_FOREACH( ::Interface *pInterface, GetInterfaces() )
+	{
+		pInterface->GetDynamicMethods().Enum( methodName, subs );
+	}
+}
+const CMethod *CClass::GetDynamicMethodOfInterfaceMethod( const UserProc *pUserProc ) const
+{
+	// 動的メソッド
+	const CMethod *result = GetDynamicMethods().GetMethodPtr( pUserProc );
+
+	if( !result )
+	{
+		// インターフェイス メソッド
+		BOOST_FOREACH( ::Interface *pInterface, GetInterfaces() )
+		{
+			result = pInterface->GetDynamicMethods().GetMethodPtr( pUserProc );
+		}
+	}
+
+	return result;
+}
+
 const ::Delegate &CClass::GetDelegate() const
 {
@@ -803,5 +831,5 @@
 		index++;
 
-		BOOST_FOREACH( const CMethod *pMethod, pInterface->GetClass().GetDynamicMethods() ){
+		BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
 			if( &pMethod->GetUserProc() == pUserProc )
 			{
@@ -833,39 +861,4 @@
 	return vtblMasterListOffset;
 }
-void CClass::GenerateVTablePart( long &vtableDataTableOffset ) const
-{
-	const UserProc **ppsi = (const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *));
-
-	//関数テーブルに値をセット
-	int i2 = 0;
-	BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){
-		if(pMethod->IsVirtual()){
-			if( !pMethod->GetUserProc().IsUsing() )
-			{
-				ts((char *)pMethod->GetUserProc().GetFullName().c_str());
-			}
-			pMethod->GetUserProc().Using();
-
-			if(pMethod->IsAbstract()){
-				extern int cp;
-				SmoothieException::Throw(300,NULL,cp);
-
-				ppsi[i2]=0;
-			}
-			else{
-				ppsi[i2]=&pMethod->GetUserProc();
-			}
-			i2++;
-		}
-	}
-
-	vtableDataTableOffset = compiler.GetObjectModule().dataTable.AddBinary( (void *)ppsi, GetVtblNum()*sizeof(LONG_PTR) );
-
-	for( int i=0; i < GetVtblNum(); i++ ){
-		pobj_Reloc->AddSchedule_DataSection(static_cast<DWORD>(vtableDataTableOffset+i*sizeof(LONG_PTR)));
-	}
-
-	free(ppsi);
-}
 void CClass::GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset )
 {
@@ -895,5 +888,5 @@
 
 	// 自身のクラスのvtblを生成
-	GenerateVTablePart( this->vtbl_offset );
+	GetDynamicMethods().GenerateVTablePart( this->vtbl_offset );
 	vtblMasterList.push_back( this->vtbl_offset );
 
@@ -902,5 +895,5 @@
 	{
 		long tempVtblOffset;
-		pInterface->GetClass().GenerateVTablePart( tempVtblOffset );
+		pInterface->GetDynamicMethods().GenerateVTablePart( tempVtblOffset );
 		vtblMasterList.push_back( tempVtblOffset );
 
@@ -946,5 +939,5 @@
 	BOOST_FOREACH( const ::Interface *pInterface, interfaces )
 	{
-		LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + pInterface->GetClass().vtbl_offset);
+		LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + pInterface->GetVtblOffset());
 
 		for( int i=0; i<pInterface->GetClass().GetVtblNum(); i++ ){
@@ -1945,5 +1938,5 @@
 		}
 
-		pCompilingMethod = pParentClass->GetDynamicMethods().GetMethodPtr( pUserProc );
+		pCompilingMethod = pParentClass->GetDynamicMethodOfInterfaceMethod( pUserProc );
 		if( !pCompilingMethod ){
 			pCompilingMethod = pParentClass->GetStaticMethods().GetMethodPtr( pUserProc );
Index: trunk/abdev/BasicCompiler_Common/src/Method.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 346)
+++ trunk/abdev/BasicCompiler_Common/src/Method.cpp	(revision 347)
@@ -103,2 +103,52 @@
 	}
 }
+
+int Methods::GetVtblNum() const
+{
+	int count = 0;
+	const Methods &methods = *this;
+	BOOST_FOREACH( const CMethod *pMethod, methods )
+	{
+		if( pMethod->IsVirtual() )
+		{
+			count++;
+		}
+	}
+	return count;
+}
+
+void Methods::GenerateVTablePart( long &vtableDataTableOffset ) const
+{
+	const UserProc **ppsi = (const UserProc **)malloc(GetVtblNum()*sizeof(UserProc *));
+
+	//関数テーブルに値をセット
+	int i2 = 0;
+	const Methods &methods = *this;
+	BOOST_FOREACH( const CMethod *pMethod, methods ){
+		if(pMethod->IsVirtual()){
+			if( !pMethod->GetUserProc().IsUsing() )
+			{
+				ts((char *)pMethod->GetUserProc().GetFullName().c_str());
+			}
+			pMethod->GetUserProc().Using();
+
+			if(pMethod->IsAbstract()){
+				SetError();
+
+				ppsi[i2]=0;
+			}
+			else{
+				ppsi[i2]=&pMethod->GetUserProc();
+			}
+			i2++;
+		}
+	}
+
+	vtableDataTableOffset = compiler.GetObjectModule().dataTable.AddBinary( (void *)ppsi, GetVtblNum()*sizeof(LONG_PTR) );
+
+	for( int i=0; i < GetVtblNum(); i++ ){
+		pobj_Reloc->AddSchedule_DataSection(static_cast<DWORD>(vtableDataTableOffset+i*sizeof(LONG_PTR)));
+	}
+
+	free(ppsi);
+}
