I'm currently coding an expression evaluator and have run into an issue regarding polymorphism. My class hierarchy is as follows: Divide inherits from Operator which inherits from the base class Expression. When I instantiate an Object of type Divide with base class Expression and try to access the function divide(int, int) i get the following error:
"Expression.cpp: In member function ‘int Expression::evaluate()’: Expression.cpp:37:6: error: ‘class Expression’ has no member named ‘divide’"
Here is "Expression.h"
#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <string>
using namespace std;
class Operator;
class Divide;
class Expression 
{
  protected:
    char **ana, *exp;
  public:
   Expression();
   ~Expression();
   Expression(char* ex);
   int evaluate();
   void tokenize();
    class EmptyException
    {
       public:
     EmptyException(string a){reason = a;};
     string getReason() const{return reason;};
       private:
     string reason;
    };
};
#endif
And here is "Expression.cpp"
#include "Expression.h"
#include "Stack.h"
#include "Queue.h"
#include "Node.h"
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include "Operator.h"
#include "Divide.h"
Expression::Expression()
{
} 
Expression::~Expression()
{
   delete [] exp;
}
Expression::Expression(char* ex)
{
   exp = ex;
   //tokenize();
}
int Expression::evaluate()
{
  Stack stack;
  Expression *tmp;
  Divide d;
  tmp = &d;
  tmp->divide(4, 2);
  stack.push(tmp);
   tmp = stack.pop();
 }
 void Expression::tokenize()
 {  
   int space = 0;
   for(int i  =0 ; i < strlen(exp); i++)
   {
     if(exp[i] == ' ')
     space++;
   } 
   char ** ana = new char*[space + 1];
   ana[0] = strtok(exp, " ");
   for(int i = 1 ; i < space + 1; i++)
   {        
   ana[i]= strtok (NULL, " ");
   }
  } 
And now the "operator.h"
#ifndef OPERATOR_H
#define OPERATOR_H
#include "Expression.h"
using namespace std;
class Operator : public Expression
{
  protected:
    bool unary, binary;
  public:
    Operator();
    bool isUnary() const;
    bool isBinary() const;
};
#endif
"Operator.cpp"
#include "Operator.h"
#include <string>
#include <cmath>
#include "Expression.h"
Operator::Operator()
{
}
bool Operator::isUnary() const 
{
      if(unary)
    return true;
      else
    return false;
}
bool Operator::isBinary() const 
{
      if(binary)
    return true;
      else
    return false; 
}
"Divide.h"
#ifndef DIVIDE_H
#define DIVIDE_H
#include <string>
#include "Operator.h"
class Expression;
using namespace std;
class Divide : public Operator
{
        private:
      char id;
    public:
        Divide();
        Divide(char);
        int divide(int a, int b);
        char identity() const;
};
#endif
"Divide.cpp"
#include "Divide.h"
int Divide::divide(int a, int b)
{
  return a/b;
}
Divide::Divide(char _id)
{
 id = _id; 
}
char Divide::identity() const
{
  return id;
}
and for in case the makefile
main: Expression.o Equation.o Operator.o Divide.o Stack.o Queue.o main.o
   g++ -static main.o Equation.o Expression.o Operator.o Divide.o Stack.o Queue.o -o main
main.o : main.cpp 
        g++ -c main.cpp 
Equation.o : Equation.cpp Equation.h
    g++ -c Equation.cpp
Expression.o : Expression.cpp Expression.h 
    g++ -c Expression.cpp 
Operator.o : Operator.cpp Operator.h Expression.h 
    g++ -c Operator.cpp 
Divide.o : Divide.cpp Divide.h Operator.h
    g++ -c Divide.cpp 
Stack.o : Stack.cpp Stack.h Node.h
    g++ -c Stack.cpp
Queue.o : Queue.cpp Queue.h Node.h
    g++ -c Queue.cpp
I have left out all the other operators such as eg. Plus, minus etc because they are all identical to what Divide is and would just complicate this question even further.
 
     
    