private static CppCompositeType createQ1_struct(DataTypeManager dtm, CppCompositeType P1_struct,
			CppCompositeType P2_struct) throws PdbException {
		String name = "Q1NS::Q1";
		SymbolPath classSp = new SymbolPath(SymbolPathParser.parse(name));
		CppCompositeType struct = createStruct(dtm, name, 20);
		struct.addDirectBaseClass(P1_struct.getComposite(), P1_struct, publicDirectAttributes, 0);
		struct.addDirectBaseClass(P2_struct.getComposite(), P2_struct, publicDirectAttributes, 8);
		struct.addMember("q1", intT, false, publicDirectAttributes, 16, null);
		struct.addVirtualMethod(0, 36, new SymbolPath(classSp, "fq1_3"), fintintT);
		struct.addVirtualMethod(0, 40, new SymbolPath(classSp, "fq1_3"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_3"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_4"), fintintT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_4"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_5"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_6"), fintintT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_6"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_7"), fintvoidT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_8"), fintintT);
		struct.addVirtualMethod(0, -1, new SymbolPath(classSp, "fp1_8"), fintvoidT);
		return struct;
	}
Class to create the vftm 32-bit program and mock PDB
Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/Vftm32ProgramCreator.java