I've no experience of programming RT applications with C++: I used Ada; also, Erlang may fit. (There is also RT Java, but I have no experience of it.)
In principle, using C++ should not be a problem, given the tools for IPC (as you mentioned),
fork, etc. Explicit memory management will of course be error-prone, unless (until) you master it.
RT Linux is an extension to Linux (obviously), and that is common for many RTOSs, to be extensions to non-RT, but time-sharing, OSs.
In order for the (RT) tasks to coexist with the (non-RT) processes, the RTOS takes certain measures: for example, lock the tasks in memory, or assign them higher priorities than the (non-RT) processes. The purpose is to make sure no (non-RT) process will ever block an (RT) task (thus possibly leading to its failure to meet its deadline). In the case of RT Linux, it will assign the Linux kernel the lowest priority.
RT Linux is between the Linux kernel and the hardware. The Linux kernel will be oblivious to this: it will perceive the hardware and RT Linux as one (i.e., as hardware). All hardware interrupts will be intercepted by the RT Linux kernel, and some (those relating to RT tasks) will be dealt with by the RTOS; the rest will be passed on to the ordinary Linux kernel.
RT Linux uses RT scheduling algorithms that ensure "predictable" behaviour (in RT lingo), that is, that all tasks meet their deadlines. This differs from Linux, which can't make any such guarantees. Also, RT Linux does not support virtual memory, as this (swapping back and forth) would lead to much longer context switches, and thus (possibly) unpredictable delay times. (In fact, all RT Linux tasks have full access to the hardware.)