Search code examples
c++11inheritancepolymorphismoperator-overloadingnew-operator

Derived class initialization with parameter of another derived class


I am new in Abstract classes so please excuse any ignorant mistakes

The exercise is given from my school, so the main.cpp file is to be used, almost as it is

I am trying to create a simple calculator in Eclipse using C++11

There exists a simple Abstract class with two virtual methods.

The two derived classes are simply the "Result" and the "Const" classes. This is the header file of the Abstract class called

Expression.h

class Expression
{
public:
    Expression();
    virtual ~Expression();
   //methods
};

Following is the source file of Expression

Expression.cpp

#include "expression.h"
#include <iostream>

Expression::Expression(){}
Expression::~Expression(){}

Then I have created two classes called Const and Result

Const.h

#include <iostream>
#include "expression.h"

class  Const : public Expression
{
public:
    Const(int value);
    //inherited methods
private:
    int value;
};

and the source file

Const.cpp

#include "expression.h"
#include "Const.h"

Const::Const(int x)
{
    value=x;
};

//inherited methods

Result.h

#include <iostream>
#include "expression.h"
#include "Const.h"

class  Result : public Expression
{
public:
    Result(Const& c);
    //inherited methods
private:
    double value;
};

Result.cpp

#include "expression.h"
#include "Result.h"
Result::Result(Const& c)
{
    value=c.point;
};
//inherited methods

So what i need is to understand

main.cpp

#include <iostream>
#include "expression.h"
#include "const.h"
#include "result.h"
void testResult()
{
    Result  res (new Const(4));
    //Here an inherited method will be used to print the contents of object res
}
int main()
{
    testResult();
    return 0;
}

The problem i can't solve is the line

Result res (new Const(4));

The error i get is

Conversion from 'Const* to non-scalar type 'Result' requested

The thing is that what is described in this line should be used as it is, and i can't seem to find exactly what it is.

EDIT

The question as asked firstly was apparently misleading due to my fault, tried to fix the question so as to describe exactly my problem


Solution

  • You started correctly, by creating a common base class for both Const and Result, but then completely ignored it. All your problems are indeed in this line:

    Result  res = (new Const(4));
    

    First of all, operator new in C++ returns a pointer, not a reference. Also, this would be a good place to make use of your base class:

    Expression* res = new Const(4);
    

    Since you declared methods evaluate() and print() as virtual, the object res is pointing to will be correctly resolved as an instance of Const when you call res->print() or res->evaluate().

    This will use Const version of print(). If you want to use the Result version - abstract classes won't help you here, you need to use casting. Create your own operator=(Const &) in Result or operator Result() in Const.