private void build(DataTypeManager dtm, CategoryPath categoryPath) {
		if (ptrOffsetInClass == null || maxTableIndexSeen == -1) {
			tableStructure = null;
			isBuilt = true;
			return;
		}
		String name = ClassUtils.getSpecialVxTableName(ptrOffsetInClass);
		DataType defaultEntry = ClassUtils.getVbtDefaultEntry(dtm);
		// Holding onto next line for now
		//int entrySize = defaultEntry.getLength();
		// Note that maxTableIndexSeen comes from addEntry() and those have what seems to be
		//  a base 1 "index" (vs. base 0 vs. offset)
		int tableNumEntries =
			(userSpecifiedNumEntries != null) ? userSpecifiedNumEntries : maxTableIndexSeen;
		// Holding onto next line for now
		//int tableSize = tableNumEntries * entrySize;
		StructureDataType dt = new StructureDataType(categoryPath, name, 0, dtm);
		int masterOrdinal = 0;
		for (Map.Entry<Integer, VirtualBaseTableEntry> mapEntry : entryByTableIndex.entrySet()) {
			// Note that entrie's tableIndex is based at 1 instead of 0
			int ordinal = mapEntry.getKey() - 1;
			VBTableEntry entry = mapEntry.getValue();
			while (masterOrdinal < ordinal) {
				dt.add(defaultEntry, "", "");
				masterOrdinal++;
			}
			String comment = entry.getClassId().getSymbolPath().toString();
			dt.add(defaultEntry, "", comment); // we could add a comment here
			masterOrdinal++;
		}
		while (masterOrdinal < tableNumEntries) {
			dt.add(defaultEntry, "", "");
			masterOrdinal++;
		}
		dt.align(defaultEntry.getAlignedLength());
		dt.setToDefaultPacking();
		tableStructure = (Structure) dtm.resolve(dt, null);
		//System.out.println(tableStructure.toString());
		isBuilt = true;
	}
Returns the built data type for this vbtable for the current entries
@param dtm the data type manager
@param categoryPath category path for the table
@return the structure of the vbtable
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/VirtualBaseTable.java