private Map<RecoveredClass, Integer> getBaseClassOffsetMap(RecoveredClass recoveredClass)
			throws CancelledException, MemoryAccessException, AddressOutOfBoundsException {

		Map<RecoveredClass, Integer> baseClassOffsetMap = new HashMap<>();

		Data baseClassArrayData = getBaseClassArray(recoveredClass);

		int baseClassOffset = 0;
		int numPointers = baseClassArrayData.getNumComponents();

		for (int i = 0; i < numPointers; ++i) {
			monitor.checkCancelled();

			// Get the base class it is pointing to
			Address pointerAddress = baseClassArrayData.getComponent(i).getAddress();

			Address baseClassDescriptorAddress =
				extendedFlatAPI.getReferencedAddress(pointerAddress, true);
			if (baseClassDescriptorAddress == null) {
				continue;
			}

			RecoveredClass baseClass = getClassFromBaseClassDescriptor(baseClassDescriptorAddress);
			if (baseClass == null) {
				// TODO: return null?
				Msg.debug(this, "Could not get base class from baseClassDescriptor " +
					baseClassDescriptorAddress.toString());
				continue;
			}

			// Continue if the class has mult inh but base class is not on the parent list
			if (!recoveredClass.getParentList().contains(baseClass)) {
				continue;
			}

			int mdisp = api.getInt(baseClassDescriptorAddress.add(8));
			int pdisp = api.getInt(baseClassDescriptorAddress.add(12));
			int vdisp = api.getInt(baseClassDescriptorAddress.add(16));
			if (pdisp == -1) {
				baseClassOffset = mdisp;
			}
			else {
				// else need to fill in the virtually inherited ones 
				// get the offset of this base class in the class using the vbtable				
				Address vbtableAddress = recoveredClass.getVbtableAddress();
				if (vbtableAddress == null) {
					Msg.error(this,
						"Cannot retrieve vbtable address so cannot create base class offset map for class " +
							recoveredClass.getName());
					return null;
				}
				baseClassOffset = api.getInt(recoveredClass.getVbtableAddress().add(vdisp)) + pdisp;
			}
			baseClassOffsetMap.put(baseClass, baseClassOffset);
		}
		return baseClassOffsetMap;
	}
Method to return the offset of the given class's single virtual parent
@param recoveredClass the given class
@return the offset in the given class structure of the classes single virtual parent or NONE 
if cannot retrieve an offset value or if there is not a single virtual parent for the given
class. Return null if cannot retrieve the offset for the single virtual parent. 
@throws CancelledException if cancelled
@throws AddressOutOfBoundsException if trying to access an address that does not exist in program
@throws MemoryAccessException  if trying to access memory that can't be accessed
Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIWindowsClassRecoverer.java