Basic question about class

 

Hi experts,

I have a little bit confuse about class.Would someone please clarify this?  Please see following code and its result,

The results show different despite both function are called from base class.Why not the same?

I understand that, If there is prefix "virtual" in front of the function , They must be used by child only?

Thank you so much

class CBase
  {
public:
   virtual string Function()
     {
      return("2 = Base");
     }
     string Function2()
     {
      return("2 = Base");
     }
  };
//+------------------------------------------------------------------+
//|   Child class 1                                                  |
//+------------------------------------------------------------------+
class Class1: public CBase
  {
public:
   string Function()
     {
      return("1 = Child");
     }
  };
//+------------------------------------------------------------------+


Class1 c1; // Load class 1

//+------------------------------------------------------------------+
//|   Function to process objects                                    |
//+------------------------------------------------------------------+
void Function(CBase  &c)
  {
   Alert(c.Function());
  }
  
  void Function2(CBase  &c)
  {
   Alert(c.Function2());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
// Process objects using one function.
   Function(c1);
   Function2(c1);

  }


 
Kittamet Sirinyamas:

Hi experts,

I have a little bit confuse about class.Would someone please clarify this?  Please see following code and its result,

The results show different despite both function are called from base class.Why not the same?

I understand that, If there is prefix "virtual" in front of the function , They must be used by child only?

Thank you so much


Why would they be called from base class once you declared c1 as Class1?
 
Laszlo Tormasi:
Why would they be called from base class once you declared c1 as Class1?

Because Class1 is a child of base. It can be used.

But This's not point, I doubt that how "virtual" prefix make different result ? .

 
Kittamet Sirinyamas: I doubt that how "virtual" prefix make different result ? .

All virtual does is allow a sub-class to override the base-class method. No override and you get the base-class version. Class1 overrides Function() with

return("1 = Child");
So any call to a class1 instance does that.
 
William Roeder:

All virtual does is allow a sub-class to override the base-class method. No override and you get the base-class version. Class1 overrides Function() with

So any call to a class1 instance does that.

Thank you

One more thing, plz see following code and its result.

Why the result still return sub-class even though no virtual function?'

class CBase
  {
public:
    string Function()
     {
      return("Base");
     }
  };
//+------------------------------------------------------------------+
//|   Child class 1                                                  |
//+------------------------------------------------------------------+
class Class1: public CBase
  {
public:
   string Function()
     {
      return("child");
     }
  };

Class1 c1;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
  Alert(c1.Function());
  }


 
Kittamet Sirinyamas:

One more thing, plz see following code and its result.

Why the result still return sub-class even though no virtual function?'

Virtual or not, class inheritance will allow similar named functions in sub-classes to replace those in the root classes.

However, virtual declaration (done correctly) in root class will REQUIRE sub-classes to implement those functions. To see what I mean, change your CBase to the following:

class CBase
  {
public:
    virtual string Function() = 0;
  };

This way, if you don't implement Function() in your Class1, the compiler will not let you proceed.

One use case will be for a container class - you want all inherited sub-classes to implement a suitable 'print' function that caters to peculiar data structures within those sub-classes.

Reason: