private VirtualFunctionTable updateVft(VxtManager vxtManager, ClassID baseId, VxtPtrInfo info,
			VxtPtrInfo parentInfo) {
		if (!(vxtManager instanceof MsVxtManager mvxtManager)) {
			// error
			return null;
		}
		ClassID parentId;
		List<ClassID> parentParentage;
		if (parentInfo == null) {
			parentId = info.baseId();
			List<ClassID> parentage = info.parentage();
			parentParentage = parentage.subList(0, parentage.size() - 1);
		}
		else {
			parentId = baseId;
			parentParentage = parentInfo.parentage();
		}

		Long finalOffset = info.finalOffset();
		VirtualFunctionTable myVft = (VirtualFunctionTable) finalVftByOffset.get(finalOffset);
		if (myVft == null) {
			Integer ordinal = getOrdinalOfKey(finalVftByOffset, finalOffset);
			myVft = mvxtManager.findVft(myId, info.parentage(), ordinal);
			if (myVft == null) {
				return null;
			}
			finalVftByOffset.put(finalOffset, myVft);
		}

		myVft.setPtrOffsetInClass(finalOffset);
		VirtualFunctionTable parentVft = mvxtManager.findVft(parentId, parentParentage, null);

		if (parentVft == null) {
			// this is an error
			return null;
		}

		for (Map.Entry<Integer, VirtualFunctionTableEntry> mapEntry : parentVft
				.getEntriesByTableIndex()
				.entrySet()) {
			int tableOffset = mapEntry.getKey();
			VFTableEntry e = mapEntry.getValue();
			SymbolPath parentOrigPath = e.getOriginalPath();
			SymbolPath parentPath = e.getOverridePath();
			VFTableEntry currentEntry = myVft.getEntry(tableOffset);
			if (currentEntry != null) {
				SymbolPath currentOrigPath = currentEntry.getOriginalPath();
				SymbolPath currentPath = currentEntry.getOverridePath();
				// Note that this check also checks the method name
				if (!parentOrigPath.equals(currentOrigPath)) {
					// problem
				}
				boolean parentOverride = !parentOrigPath.equals(parentPath);
				boolean currentOverride = !currentOrigPath.equals(currentPath);
				if (!currentOverride && parentOverride) {
					myVft.addEntry(tableOffset, parentOrigPath, parentPath, e.getFunctionPointer());
				}
				else if (currentOverride && !parentOverride) {
					myVft.addEntry(tableOffset, currentOrigPath, currentPath,
						e.getFunctionPointer());
				}
				else {
					// maybe order matters?
				}
			}
			else {
				myVft.addEntry(tableOffset, parentOrigPath, parentPath, e.getFunctionPointer());
			}
		}
		return myVft;
	}
Updates vftable entries with values from this class that override those of parent classes
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java