Un número decimal se representa de forma normal: 1, 2, 5, 199, 254, etc. Un número octal se representa prefijando un 0 al valor: 01, 02, 07, 016, etc. Un número hexadecimal se representa prefijando un 0x: 0x1, 0x2, 0x6, 0x1A, 0xFF, etcétera.
A nivel de variables numéricas no hay diferencia. Las siguientes sentencias son válidas:
int i = 0x14;
int j = 16;
int k = 07;
int m = i+j+k;
Esto es porque el valor es el mismo. Ahora, la cosa cambia cuando las transformas a caracteres. Al hacer esto, usualmente empleas la función itoa o sus variantes (p.e. ltoa). Esta función tiene un tercer parámetro en el cuál indicas la base del número. Así:
char szNum[50] = "";
int iValor;
iValor = 5;
itoa(iValor, szNum, 10);
cout << szNum << endl; // imprime: "5"
iValor = 255;
itoa(iValor, szNum, 16);
cout << szNum << endl; // imprime "0xFF"
etcétera. También hay algunas otras funciones, como std::hex:
cout << hex << 25 << endl; // imprime "0x19"
Saludos.