.NET Fiddle

CSharp · Console

/Program.cs

using System;
					
public class Program
{
	public static void Main()
	{
		Console.WriteLine("new BaseOuter");
		var baseOuter = new BaseOuter();
		Console.WriteLine("\nnew DerivedOuter");
		var derivedOuter = new DerivedOuter();
	}
	
	class BaseOuter{
		protected BaseInner baseInner;
		public BaseOuter(){
			Console.WriteLine("BaseOuter Constructor");
			/*  lots of stuff I want in derived class */

			// This is an anti-pattern I want to avoid
			//https://www.jetbrains.com/help/resharper/2018.2/VirtualMemberCallInConstructor.html
			InitializeInner();
		}
		
		protected virtual void InitializeInner(){
			Console.WriteLine("    BaseOuter Initialize BaseInner");
			baseInner = new BaseInner();
		}
		
		protected class BaseInner{
			public int x;
			public BaseInner(){
				/* stuff that is needed in DerivedInner too */
				Console.WriteLine("        BaseInner Constructor");
				x = 2;
			}
		}		
	}
	
	class DerivedOuter : BaseOuter {
		public DerivedOuter() {
			Console.WriteLine("DerivedOuter Constructor (finished)");
		}
		
		protected override void InitializeInner(){
			Console.WriteLine("    DerivedOuter Initialize DerivedInner");
			baseInner = new DerivedInner();
		}

		protected class DerivedInner : BaseInner {
			public double y;
			public DerivedInner(){
			Console.WriteLine("        DerivedInner Constructor");
				y = 2d;
			}
		}
	}
}
;