inheritance - using base class member variables
Hello, I having problems understanding and using the member variables of a class that inherits from MonoBehavior.
I have class A that inherits from MonoBehavior:
   class A: MonoBehaviour
     {
         protected char[] code;
         /// this method uses member variable "code"
         public virtual void AddItem(uint pos, char letter)   
         {
              if (code[pos] == letter && code.Length < 4)
              {
                   Debug.log("You WIn");
              }
          }
     }
 
 
               and class B that inherits from class A:
 public class B: A
 {
     void Start () {
         code = new char[] { 'A', 'A', 'D', 'W' };  // Here I initialize the member variable "code" 
     }
 }
 
               Class B is attached to a game object (GO) that has a component (myClassB).
 public class GO : MonoBehaviour
 {
     public B myClassB;
     void OnTriggerEnter(Collider other)
     {
         // here it calls AddItem, inherited method. it should call A::AddItem
         myClassB.AddItem(pos,label);  
     }
 }
 
               In game, when my GO receives an event it calls myClassB.AddItem, which is the method inherited from the base class A. However, I got a NullReferenceException in the AddItem method because I havent initialized the member variable "code". I thought the Start method in class B would do that.
I set a protected member variable "id" on the parent equals to 0. Later, the Start method of the derived class I increased that value to 1. But when the event in the GO calls myClassB.AddItem, I noticed the parent "id" variable gets back to 0. Like the GO was initialized entirely.
I hope it makes sense and you guys can give me a hand on what is happening.
Answer by Tobychappell · Aug 07, 2018 at 11:55 AM
Try putting a Debug.Log in class B's Start method to see if it is being called.
Got a feeling you may need to have 'public virtual void Start()' in class A for class B to override.
I think Unity uses reflection to find callbacks that are in the monobehavior such as Awake/Start/Update in a child class. If this is true, then these wont be called as Unity inspects class A and sees no Start() method and does not try to call it.
Answer by kmilo9999 · Aug 08, 2018 at 02:22 AM
Hi!
I put the Debug.Log in class B's Start method and indeed It's called. Unfortunately, it did not change the outcome.

Also, I tried initializing the member variable in the Awake method of class B, but same error.
  void Awake () {
         
         code = new char[] { 'A', 'A', 'D', 'W' };
         Debug.Log("B::Awake");
         
     }
 
               Also, I tried using:
  public virtual void Start()
 
               In the base class, but it didnt work either.
What I'm trying to do seems logic from a C++ point of view. I dont know if inheritance works different in C sharp.
I appreciate the help.
Your answer