Ovviamente la risposta è: "dipende"
Il C++ è un linguaggio molto potente che ti permette di fare di tutto.
Il livello di portabilità lo decidi tu, rispettando lo standard ed evitando le eventuali peculiarità del compilatore che usi per sviluppare.
Se tu segui lo standard e sviluppi un'applicazione con un determinato compilatore, senza fare assunzioni sul tipo di rappresentazione in memoria dei tipi base (ad esempio non basarti mai sul fatto che un int su windows sta su 32 bit) puoi essere ragionevolmente tranquillo di poter ricompilare la tua applicazione per un'altra piattaforma con un'altro compilatore.
Per quanto riguarda le applicazioni a finestre, qeuste fanno un pesante uso delle funzioni di sistema, che dipendono dal sistema operativo e non dal linguaggio.
Per avere la portablità in questo caso occorre scegliere una libreria (framework è un tipo di libreria) che astragga dal sistema operativo i concetti di finestra, bottone etc etc...
Sicuramente scrivere un'applicazione a finestre in C++ è meno immediato che Visual Basic.
In quanto alla scelta tra C e C++, il C++ supporta il paradigma di programmazione ad oggetti, mentre il C no. Questo lo rende un linguaggio più potente e flessibile. Inoltre è più rigoroso sul controllo dei tipi, pertanto il compilatore C++ è in grado di accorgersi di più errori di un compilatore C.
In ogni caso, per imparare il C++ devi prima imparare il C.
Ciao