codice:
#include <iostream>
using namespace std;
class ChessPiece
{
	
	public:
		ChessPiece(){color=-2;type=' ';}
		int color; //0 black 1white
		char type;//p:pawn b:bishop r:Rook q:queen k:king n:knight
		virtual int move(int i,int j,ChessPiece ** game){cout<<endl<<"No Piece moving"<<endl; return -1; }
};

class King : public ChessPiece
{
	public:
		King::King(char k);
		int move(int i,int j,ChessPiece ** game);
};

class Pawn : public ChessPiece
{
	public:
		Pawn::Pawn(char p);
		virtual int move(int i,int j,ChessPiece ** game);

};

class Rook : virtual public ChessPiece
{

	public:
		Rook::Rook(){}
		Rook::Rook(char r);
		virtual int move(int i,int j,ChessPiece ** game);

};

class Bishop : virtual public ChessPiece
{
	public:
		Bishop::Bishop(){}
		Bishop::Bishop(char b);
		virtual int move(int i,int j,ChessPiece ** game);

};

class Knight : public ChessPiece
{
	public:
		Knight::Knight(char n);
		virtual int move(int i,int j,ChessPiece ** game);

};

class Queen : public Rook, public Bishop
{
	public:
		Queen::Queen(char p);
		int move(int i,int j,ChessPiece ** game);

};

ChessPiece ** Game(char ** cGame);

int check(ChessPiece ** game);

#include "header.h"
#include <string>
using namespace std;

ChessPiece ** Game(char ** cGame)
{
	ChessPiece ** game;
	game=new ChessPiece *[8];
	for(int i=0;i<=7;i++)
	{
		game[i]=new ChessPiece[8];
		for(int j=0;j<=7;j++)
		{
			char piece=cGame[i][j];
			switch(piece)
			{
			case 'k':
				{
					game[i][j]= King(piece);
					break;
				}
			case 'K':
				{
					game[i][j]= King(piece);
					break;
				}
			case 'q':
				{
					game[i][j]= Queen(piece);
					break;
				}
			case 'Q':
				{
					game[i][j]= Queen(piece);
					break;
				}
			case 'b':
				{
					game[i][j]= Bishop(piece);
					break;
				}
			case 'B':
				{
					game[i][j]= Bishop(piece);
					break;
				}
			case 'r':
				{
					game[i][j]= Rook(piece);
					break;
				}
			case 'R':
				{
					game[i][j]= Rook(piece);
					break;
				}
			case 'n':
				{
					game[i][j]= Knight(piece);
					break;
				}
			case 'N':
				{
					game[i][j]= Knight(piece);
					break;
				}
			case 'p':
				{
					game[i][j]= Pawn(piece);
					break;
				}
			case 'P':
				{
					game[i][j]= Pawn(piece);
					break;
				}
			case '.':
				{
					game[i][j]= ChessPiece();
					break;
				}
			}
		}
	}
	return game;
}


int check(ChessPiece ** game)
{
	int loser=-1;
	for(int i=0;i<=7 && loser==-1;i++)
		{
			for(int j=0;j<=7 && loser==-1;j++)
			{
				if(game[i][j].color!=-2)
				loser=game[i][j].move(i,j,game);
			}
		}
	
	return loser;
}

#include "stdafx.h"
#include "header.h"
#include <string>
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	char ** cGame ;
	string s1="..k.....ppp.pppp.........R...B..................PPPPPPPPK.......";
	int i=0;
	cGame=new char *[8];
	for (int w=0;w<=7;w++)
	{
		cGame[w]=new char[8];
		for(int k=0;k<=7;k++)
		{
			cGame[w][k]=s1[i];
			cout<<cGame[w][k];
			i++;
		}
		cout<<endl;
	}
	i=0;
	cout<<endl;
	
	ChessPiece ** game=Game(cGame);
	for (int w=0;w<=7;w++)
	{
		for(int k=0;k<=7;k++)
		{
		
			cout<<"("<<game[w][k].type<<","<<game[w][k].color<<")";
			i++;
		}
		cout<<endl;
	}
	
	int loser=check(game);
	
	switch(loser)
	{
		case -1:{cout<<"Game #d: no king is in check."<<endl; break;}
		case 0:{cout<<"Game #d: black king is in check."<<endl; break;}
		case 1:{cout<<"Game #d: white king is in check."<<endl; break;}
		default :{cout<<"prob"<<endl; break;}
	}
	cout<<loser<<endl;
	
	int a=0;
	cin>>a;
	return 0;
}
Credo che comunque, come ho scritto in precedenza , il problema stia nella prima porzione di codice che ho postato e in particolare sulla chiamata di move(). Ho fatto delle prove e scrivendo :

PieceChess * p=new King('k');
int loser=p.move(i,j,game);

funziona tutto.

Invece evidentemente nei metodi check() e game() faccio qualcosa di diverso, ma non capisco bene cosa.
Scrivendo
codice:
ChessPiece ** game;
	game=new ChessPiece *[8];
	for(int i=0;i<=7;i++)
	{
		game[i]=new ChessPiece[8];
		for(int j=0;j<=7;j++)
		{
			char piece=cGame[i][j];
			game[i][j]= King(piece);
					break;
		}
}
int loser=game[0][0].move(0,0,game);
Cosa cambia rispetto a :
PieceChess * p=new King('k');
int loser=p.move(i,j,game);