Index: BasicCompiler_Common/Class.cpp
===================================================================
--- BasicCompiler_Common/Class.cpp	(revision 129)
+++ BasicCompiler_Common/Class.cpp	(revision 131)
@@ -102,5 +102,5 @@
 		foreach( CMember *member, objClass.staticMembers ){
 			char temporary[VN_SIZE];
-			sprintf(temporary,"%s.%s",objClass.name,member->name);
+			sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->name);
 			dim(
 				temporary,
@@ -151,6 +151,6 @@
 
 
-CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name )
-	: namespaceScopes( namespaceScopes )
+CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name )
+	: Prototype( namespaceScopes, name )
 	, importedNamespaces( importedNamespaces )
 	, ConstructorMemberSubIndex( 0 )
@@ -168,12 +168,7 @@
 	, pobj_NextClass( NULL )
 {
-	this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
-	lstrcpy(this->name,name);
 }
 CClass::~CClass(){
 	int i;
-
-	//クラス名
-	HeapDefaultFree(name);
 
 	if(ppobj_Member){
@@ -202,4 +197,14 @@
 }
 
+bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
+{
+	BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){
+		if( pInterfaceClass == &objInterface.GetInterfaceClass() ){
+			return true;
+		}
+	}
+	return false;
+}
+
 bool CClass::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const
 {
@@ -253,9 +258,70 @@
 }
 
-bool CClass::Inherits( const CClass &inheritsClass, int nowLine ){
+bool CClass::Inherits( const char *inheritNames, int nowLine ){
+	int i = 0;
+	bool isInheritsClass = false;
+	while( true ){
+
+		char temporary[VN_SIZE];
+		for( int i2=0;; i++, i2++ ){
+			if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
+				temporary[i2] = 0;
+				break;
+			}
+			temporary[i2] = inheritNames[i];
+		}
+
+		//継承元クラスを取得
+		const CClass *pInheritsClass = pobj_DBClass->Find(temporary);
+		if( !pInheritsClass ){
+			SetError(106,temporary,i);
+			return false;
+		}
+
+		if( pInheritsClass->IsInterface() ){
+			// インターフェイスを継承する
+			if( !InheritsInterface( *pInheritsClass, nowLine ) ){
+				return false;
+			}
+		}
+		else if( pInheritsClass->IsClass() ){
+			// クラスを継承する
+			isInheritsClass = true;
+
+			if( !InheritsClass( *pInheritsClass, nowLine ) ){
+				return false;
+			}
+		}
+		else{
+			SetError(135,NULL,nowLine);
+			return false;
+		}
+
+		if( inheritNames[i] == '\0' ){
+			break;
+		}
+		i++;
+	}
+
+	if( !isInheritsClass ){
+		// クラスを一つも継承していないとき
+		const CClass *pObjectClass = pobj_DBClass->Find("Object");
+		if( !pObjectClass ){
+			SetError(106,"Object",i);
+			return false;
+		}
+
+		if( !InheritsClass( *pObjectClass, i ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
 
 	//ループ継承でないかをチェック
 	if(pobj_LoopRefCheck->check(inheritsClass)){
-		SetError(123,inheritsClass.name,nowLine);
+		SetError(123,inheritsClass.GetName(),nowLine);
 		return false;
 	}
@@ -263,7 +329,7 @@
 	if( inheritsClass.ppobj_Member == 0 ){
 		//継承先が読み取られていないとき
-		pobj_LoopRefCheck->add(this->name);
-		pobj_DBClass->GetClass_recur(inheritsClass.name);
-		pobj_LoopRefCheck->del(this->name);
+		pobj_LoopRefCheck->add(this->GetName().c_str());
+		pobj_DBClass->GetClass_recur(inheritsClass.GetName().c_str());
+		pobj_LoopRefCheck->del(this->GetName().c_str());
 	}
 
@@ -317,5 +383,5 @@
 	//ループ継承でないかをチェック
 	if(pobj_LoopRefCheck->check(inheritsInterface)){
-		SetError(123,inheritsInterface.name,nowLine);
+		SetError(123,inheritsInterface.GetName(),nowLine);
 		return false;
 	}
@@ -323,7 +389,7 @@
 	if( inheritsInterface.ppobj_Member == 0 ){
 		//継承先が読み取られていないとき
-		pobj_LoopRefCheck->add(this->name);
-		pobj_DBClass->GetClass_recur(inheritsInterface.name);
-		pobj_LoopRefCheck->del(this->name);
+		pobj_LoopRefCheck->add(this->GetName().c_str());
+		pobj_DBClass->GetClass_recur(inheritsInterface.GetName().c_str());
+		pobj_LoopRefCheck->del(this->GetName().c_str());
 	}
 
@@ -348,12 +414,8 @@
 	}
 
+	interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl_num ) );
+
 	//仮想関数の数
 	vtbl_num += inheritsInterface.vtbl_num;
-
-	/*
-	TODO: インターフェイス向けの機構を作る
-	//継承先のクラスをメンバとして保持する
-	pobj_InheritsClass = &inheritsInterface;
-	*/
 
 	return true;
@@ -404,5 +466,5 @@
 	//メンバ
 	for( int i=0;i<iMemberNum;i++){
-		if(lstrcmp(name,ppobj_Member[i]->name)==0){
+		if( GetName() == ppobj_Member[i]->name ){
 			return 1;
 		}
@@ -411,5 +473,5 @@
 	//静的メンバ
 	foreach( CMember *member, staticMembers ){
-		if( lstrcmp( name, member->name ) == 0 ){
+		if( GetName() == member->name ){
 			return 1;
 		}
@@ -1066,5 +1128,5 @@
 	BOOL fConstructor=0,bDestructor=0;
 
-	if(lstrcmp(temporary,pobj_c->name)==0){
+	if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){
 		//コンストラクタの場合
 
@@ -1077,5 +1139,5 @@
 	else if(temporary[0]=='~'){
 		//デストラクタの場合はその名前が正しいかチェックを行う
-		if(lstrcmp(temporary+1,pobj_c->name)!=0)
+		if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0)
 			SetError(117,NULL,nowLine);
 		else
@@ -1170,14 +1232,14 @@
 			if(pobj_LoopRefCheck->check(pMember->GetClass())){
 				extern int cp;
-				SetError(124,pMember->GetClass().name,cp);
+				SetError(124,pMember->GetClass().GetName(),cp);
 				return 0;
 			}
 
-			pobj_LoopRefCheck->add(objClass.name);
+			pobj_LoopRefCheck->add(objClass.GetName().c_str());
 
 			i2=MemberVar_LoopRefCheck(pMember->GetClass());
 			if(bRet==1) bRet=i2;
 
-			pobj_LoopRefCheck->del(objClass.name);
+			pobj_LoopRefCheck->del(objClass.GetName().c_str());
 		}
 	}
@@ -1243,5 +1305,5 @@
 
 			if(lpszInheritsClass){
-				if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
+				if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
 					//継承先先読み用
 					continue;
@@ -1271,5 +1333,5 @@
 				}
 
-				if(lstrcmpi(temporary,pobj_c->name)==0){
+				if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
 					SetError(105,temporary,i);
 					goto Interface_InheritsError;
@@ -1284,5 +1346,5 @@
 
 				//継承させる
-				if( !pobj_c->InheritsInterface( *pInheritsClass, i ) ){
+				if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
 					goto Interface_InheritsError;
 				}
@@ -1394,5 +1456,5 @@
 
 			if(lpszInheritsClass){
-				if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
+				if( pobj_c->GetName() != lpszInheritsClass ){
 					//継承先先読み用
 					continue;
@@ -1418,10 +1480,10 @@
 			else dwAccess=ACCESS_PUBLIC;
 
-			if( lstrcmp( pobj_c->name, "Object" ) == 0 || dwClassType == ESC_TYPE ){
-				//継承無し
-				pobj_c->pobj_InheritsClass=0;
-
-				//仮想関数の数を初期化
-				pobj_c->vtbl_num=0;
+			if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){
+				// 継承無し
+				pobj_c->pobj_InheritsClass = NULL;
+
+				// 仮想関数の数を初期化
+				pobj_c->vtbl_num = 0;
 			}
 			else{
@@ -1439,5 +1501,5 @@
 					}
 
-					if(lstrcmpi(temporary,pobj_c->name)==0){
+					if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
 						SetError(105,temporary,i);
 						goto InheritsError;
@@ -1450,28 +1512,5 @@
 				}
 
-				//継承元クラスを取得
-				const CClass *pInheritsClass = Find(temporary);
-				if( !pInheritsClass ){
-					SetError(106,temporary,i);
-					goto InheritsError;
-				}
-
-				if( pInheritsClass->IsInterface() ){
-					// クラスを継承していないとき
-					const CClass *pObjectClass = Find("Object");
-					if( !pObjectClass ){
-						SetError(106,"Object",i);
-						goto InheritsError;
-					}
-
-					if( !pobj_c->Inherits( *pObjectClass, i ) ){
-						goto InheritsError;
-					}
-				}
-
-				//継承させる
-				if( !pobj_c->Inherits( *pInheritsClass, i ) ){
-					goto InheritsError;
-				}
+				pobj_c->Inherits( temporary, i );
 			}
 InheritsError:
@@ -1596,5 +1635,5 @@
 							if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){
 								//参照先が読み取られていないとき
-								GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().name);
+								GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().GetName().c_str());
 							}
 						}
@@ -1603,10 +1642,10 @@
 						if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
 							//循環参照のチェック
-							pobj_LoopRefCheck->add(pobj_c->name);
+							pobj_LoopRefCheck->add(pobj_c->GetName().c_str());
 							if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){
 								//エラー回避
 								pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID );
 							}
-							pobj_LoopRefCheck->del(pobj_c->name);
+							pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
 						}
 					}
@@ -1709,8 +1748,8 @@
 			, 1
 			, ESC_NEW
-			, ""						// 名前空間 (TODO: 実装)
-			, objClass.name				// クラス名
-			, referenceOffsetsBuffer	// 参照メンバオフセット配列
-			, numOfReference			// 参照メンバの個数
+			, ""							// 名前空間 (TODO: 実装)
+			, objClass.GetName().c_str()	// クラス名
+			, referenceOffsetsBuffer		// 参照メンバオフセット配列
+			, numOfReference				// 参照メンバの個数
 			);
 
@@ -1749,6 +1788,6 @@
 			sprintf( temporary
 				, "tempType=Search(\"%s\",\"%s\")"
-				, ""				// 名前空間 (TODO: 実装)
-				, objClass.name		// クラス名
+				, ""							// 名前空間 (TODO: 実装)
+				, objClass.GetName().c_str()	// クラス名
 				);
 
@@ -1759,5 +1798,5 @@
 				, "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
 				, ""								// 名前空間 (TODO: 実装)
-				, objClass.pobj_InheritsClass->name	// 基底クラス名
+				, objClass.pobj_InheritsClass->GetName().c_str()	// 基底クラス名
 				);
 
