One thing I noticed in your first post : "are very visually oriented". Game programing is quite never choosing between graphic or sound game. The screen or the audio output is the interface with the player, and the controller/keyboard+mouse is the input. But inside the system you programed, it's exactly the same. You have to adapt your game to be playable with just an audio output, but inside, it's the same.
So if an AI is made by looking at directions and all, your system should be able to do that, no matter if it's an audio game or not.
What does an AI do, for example? Looking in forward and try to see if there's an enemy less than 10 meters away? Why couldn't you do that with an audio game? You can do all this.
I'm not a pro in AI programing I only know some words like state machines and all. But I can help you with inheritance and interfaces
Let's first talk about operator overloading : when you program, your code often do comparisons, for example. So know if "th object which was given to the function is the one you are looking for", for example. And, maybe for you two "People objects" are the same if their name, age and weight are equal. But for the language, myObject == anObject will by default check if their references are the same. Their adress in memory. So, you override functions (with inheritance) like opEqual, which define the behaviour of an object when compared to another. The result is a boolean and the tests are made inside.
Another example is the vector function : if you want to add two vectors objects to get a third one, the language will not let you doing this. Adding an object to an other? That makes no sense. But if you override the opAdd function to tell it "theses objects can do it!", it will be ok.
Why using inheritance? Because whatever the game you are trying to build, the goal is always the same : representing a world only with objects. Objects with attributes and rules. But a frog is an animal, like dogs are. They share a certain number of legs, a weight because they are solid, etc. So, you may see an Animal class and a Dog class inheriting from it. Why doing this? Because adding new Animal children like a Cat class can then be done without having to rewrite what cats share with other animals. And if you correctly cut all in classes, you can modify the behaviour of all your animal by modifying one line.
What are interfaces? You can have a class which inherits from two classes. A dog is an animal, nothing more. But what if you want to know which objects may explode? Barrels may explode, cars may explode, and they share nothing. So, you create interfaces which will represent some shared behaviours where classes are made to give a structure to the objects. You can find all theses examples in every game.
Programing is in two parts: you create the classes and interfaces, the models of your world, and in an other part you play with them.
For AI, in my BGT game engine project I didn't made them for now, but it's planned. For now, I leave to developers the choice to program them as they wish, but I give them a lot of "tools". The system let objects know what is in an X Y position, their position, what are the objects in the game, and all.