Не обязательно, что «каждому объекту - при создании - в HEAP будет предоставлено место для переменных-членов». Каждый создаваемый вами объект будет занимать некоторое ненулевое пространство где-то для его переменных-членов, но где находится вопрос о том, как вы выделяете сам объект. Если объект имеет автоматическое (стековое) размещение, то же самое относится и к его элементам данных. Если объект размещен в свободном хранилище (куче), то также будут и его элементы данных. В конце концов, каково распределение объекта, отличного от распределения его элементов данных?
Если объект, выделенный в стеке, содержит указатель или другой тип, который затем используется для размещения в куче, такое выделение будет происходить в куче независимо от того, где был создан сам объект.
Для объектов с виртуальными функциями у каждого будет выделенный указатель vtable, как если бы он был явно объявленным членом данных в классе.
Что касается функций-членов, то код для них, скорее всего, не отличается от кода свободных функций с точки зрения того, куда он идет в исполняемом образе. В конце концов, функция-член в основном является свободной функцией с неявным указателем «this» в качестве первого аргумента.
Наследование ничего не меняет.
Я не уверен, что вы имеете в виду, когда библиотеки DLL получают свой собственный стек. DLL не является программой, и ей не нужно иметь стек (или кучу), поскольку объекты, которые она размещает, всегда размещаются в контексте программы, которая имеет свой собственный стек и кучу. То, что в DLL есть сегменты кода (текста) и данных, имеет смысл, хотя я не являюсь экспертом в реализации таких вещей в Windows (которую я предполагаю, что вы используете, учитывая вашу терминологию).