使用另一个派生类

时间:2017-07-09 16:25:14

标签: c++11 inheritance polymorphism operator-overloading new-operator

我是抽象类的新手,所以请原谅任何无知的错误

这个练习来自我的学校,所以main.cpp文件将被使用,几乎就像它一样

我正在尝试使用C ++ 11在Eclipse中创建一个简单的计算器

存在一个简单的Abstract类,它有两个虚方法。

两个派生类只是"结果"和#34; Const"类。 这是名为

的Abstract类的头文件
  

Expression.h

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

以下是Expression

的源文件
  

Expression.cpp

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

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

然后我创建了两个名为Const和Result

的类
  

Const.h

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

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

和源文件

  

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

所以我需要的是理解

  

的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;
}

我无法解决的问题是行

Result res (new Const(4));

我得到的错误是

  

从Const *转换为非标量类型&#39;结果&#39;请求的

事情是,这一行中描述的内容应该按原样使用,而我似乎无法确切地找到它是什么。

修改

由于我的过错,首先提出的问题显然具有误导性,试图解决问题以便准确描述我的问题

4 个答案:

答案 0 :(得分:0)

如果有两个派生类DerivedClass1DerivedClass2都派生自某些BaseClass然后实例化指向DerivedClass1的指针并以多态方式使用它:< / p>

BaseClass* p = new DerivedClass1;

创建指向DerivedClass2的基类指针:

BaseClass* p = new DerivedClass2;

而不是:

DerivedClass1* p = new DerivedClass2;

在您的示例中,ResultConst类都派生自Expression类,因此存在混淆。要传入SomeClass&类型的参数,请创建SomeClass的临时对象并将其传入:

SomeClass o;
someFunction(o);

答案 1 :(得分:0)

您通过为ConstResult创建公共基类来正确启动,但后来完全忽略了它。 你所有的问题确实都在这一行:

Result  res = (new Const(4));

首先,C ++中的operator new返回一个指针,而不是一个引用。此外,这将是一个使用基类的好地方:

Expression* res = new Const(4);

由于您将方法evaluate()print()声明为virtual,因此当您指向的res对象将被正确解析为Const的实例致电res->print()res->evaluate()

这将使用Const的{​​{1}}版本。如果你想使用print()版本 - 抽象类对你没有帮助,你需要使用强制转换。在Resultoperator=(Const &)Result创建您自己的operator Result()

答案 2 :(得分:0)

班级ResultConst是两个不同的班级。意思是类型转换

Result *res = (new Const(4));

是不可能的。要做你想做的事,因为这两个类都继承自Expression

  Expression * res = new Result( objConst);

其中objConstConst个对象。

答案 3 :(得分:0)

一个问题是

double point= value;

不会初始化您的成员,而是新的未使用的本地变量。

只是做

point = value;