private List<ClassPdbMember> getSelfBaseClassMembers() {
		// Attempting to use TreeMap to sort with the key being a record of
		//  ByteBitOffset (Long byteOff, int bitOff, int ordinal) {}
		//  so that vxtptrs could get injected properly, but this did not work until the "ordinal"
		//  field was included, but the overall solution still does not work because of the
		//  ordering of records when flattened (as MSFT does them) unions are in play.  In such
		//  cases we might get members at offsets: 0, 4, 8, 12, 14, 16, 20 24, 12, 16, 24, 28, 32
		//  which has a union at offset 12 within this outer type.
		// Thus, we just insert the vxts into the members list that is constructed with
		//  base classes and regular members
		hasZeroBaseSize = true;
		List<ClassPdbMember> members = new ArrayList<>();
		String accumulatedComment = "";
		for (DirectLayoutBaseClass base : directLayoutBaseClasses) {
			CppCompositeType baseComposite = base.getBaseClassType();
			// Cannot do baseComposite.getSelfBaseType().isZeroLength()
			//  or baseComposite.getComposite().isZeroLength()
			if (!baseComposite.hasZeroBaseSize()) {
				hasZeroBaseSize = false;
				String comment = BASE_COMMENT;
				if (!accumulatedComment.isEmpty()) {
					comment += " and previous " + accumulatedComment;
				}
				Composite baseDataType = base.getSelfBaseDataType();
				int offset = base.getOffset();
				// This does not have attributes like "Member" does (consider changes?)
				ClassPdbMember classPdbMember =
					new ClassPdbMember("", baseDataType, false, offset, comment);
				members.add(classPdbMember);
				accumulatedComment = "";
			}
			else {
				// Note that if there is only base and it has zero size, this message will not
				// get output.  Consider where we might notate this case in the structure for
				// an improved result
				String comment =
					"(Empty Base " + base.getDataTypePath().getDataTypeName() + ")";
				accumulatedComment += comment;
			}
		}
		hasZeroBaseSize &= layoutVftPtrMembers.size() == 0;
		hasZeroBaseSize &= layoutVbtPtrMembers.size() == 0;
		hasZeroBaseSize &= layoutMembers.size() == 0;

		for (Member member : layoutMembers) {
			ClassPdbMember classPdbMember =
				new ClassPdbMember(member.getName(), member.getDataType(),
					member.isFlexibleArray(), member.getOffset(), member.getComment());
			members.add(classPdbMember);
		}

		for (Member vftMember : layoutVftPtrMembers) { // not expecting more than one
			ClassPdbMember classPdbMember =
				new ClassPdbMember(vftMember.getName(), vftMember.getDataType(),
					vftMember.isFlexibleArray(), vftMember.getOffset(), vftMember.getComment());
			int vOff = vftMember.getOffset();
			int index = 0;
			for (ClassPdbMember member : members) {
				if (member.getOffset() >= vOff) {
					break;
				}
				index++;
			}
			members.add(index, classPdbMember);
		}
		for (Member vbtMember : layoutVbtPtrMembers) { // not expecting more than one
			ClassPdbMember classPdbMember =
				new ClassPdbMember(vbtMember.getName(), vbtMember.getDataType(),
					vbtMember.isFlexibleArray(), vbtMember.getOffset(), vbtMember.getComment());
			int vOff = vbtMember.getOffset();
			int index = 0;
			for (ClassPdbMember member : members) {
				if (member.getOffset() >= vOff) {
					break;
				}
				index++;
			}
			members.add(index, classPdbMember);
		}
		return members;
	}
Returns the self base class members, including possible direct self bases, vxts, and
regular members
@return the members
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java