### Godot version

4.0 beta 10, also 3.5.1

### System information

Windows 11

### Issue description

Creating a Mainloop inherited from SceneTree makes sense when you want to add a few features to SceneTree instead of starting from scratch. Unfortunately, this doesn't work as well, as if its type is erased.

But inheriting from Mainloop directly (in the example) can work properly.


### Steps to reproduce

1. Create a mainloop extends SceneTree. In this case, I call it `MyGDScriptMainLoop`.

```gdscript
class_name MyGDScriptMainLoop extends SceneTree

func say_hello():
    print("hello")
```

2. Go to project settings, set `application/run/main_loop_type` to `MyGDScriptMainLoop`.
3. Create a test scene and try to call `Engine.get_main_loop().say_hello()`.

```gdscript
extends Node2D


# Called when the node enters the scene tree for the first time.
func _ready() -> void:
    Engine.get_main_loop().say_hello()
    pass # Replace with function body.
```

Then you will see:

![image](https://user-images.githubusercontent.com/93276898/210129049-0250a15f-2f87-49a1-b066-16ef5e695302.png)

And also I found that `Engine.get_main_loop() is MyGDScriptMainLoop` is `false`.

Using GDExtension to do this also failed. But since I'm using godot-rust, I'm not sure if this problem exists with godot-cpp.

### Minimal reproduction project

[bug.zip](https://github.com/godotengine/godot/files/10327002/bug.zip)

}
#ifdef MINIZIP_ENABLED
	
	zip_packed_data = ZipArchive::get_singleton();
	
	if (!zip_packed_data) {
		zip_packed_data = memnew(ZipArchive);
	}
	packed_data->add_pack_source(zip_packed_data);
#endif
	
	Error exit_code = ERR_INVALID_PARAMETER;
	I = args.front();
	while (I) {
#ifdef MACOS_ENABLED
		
		
		if (I->get().begins_with("-psn_")) {
			I = I->next();
			continue;
		}
#endif
		List<String>::Element *N = I->next();
#ifdef TOOLS_ENABLED
		if (I->get() == "--debug" ||
				I->get() == "--verbose" ||
				I->get() == "--disable-crash-handler") {
			forwardable_cli_arguments[CLI_SCOPE_TOOL].push_back(I->get());
			forwardable_cli_arguments[CLI_SCOPE_PROJECT].push_back(I->get());
		}