使用另一个派生 class 的参数派生 class 初始化

Derived class initialization with parameter of another derived class

我是 Abstract 的新手 classes 所以请原谅任何无知的错误

作业是我学校给的,所以要用main.cpp文件,几乎原样

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

存在一个带有两个虚拟方法的简单抽象 class。

两个派生的 classes 就是 "Result" 和 "Const" classes。 这是名为

的摘要 class 的头文件

Expression.h

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

下面是表达式的源文件

Expression.cpp

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

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

然后我创建了两个 classes 称为 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));

我得到的错误是

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

问题是这一行中描述的内容应该按原样使用,我似乎无法找到它到底是什么。

编辑

首先问的问题显然是我的错造成的误导,试图修正问题以便准确描述我的问题

如果你有两个派生的 classes DerivedClass1DerivedClass2 都派生自一些 BaseClass 然后实例化一个指向 DerivedClass1 的指针并使用它以多态方式使用:

BaseClass* p = new DerivedClass1;

要创建指向 DerivedClass2 的基 class 指针,请使用:

BaseClass* p = new DerivedClass2;

而不是:

DerivedClass1* p = new DerivedClass2;

在您的示例中,ResultConst class 都是从 Expression class 派生的,因此会造成混淆。要传入 SomeClass& 类型的参数,创建一个 SomeClass 的临时对象并将其传入:

SomeClass o;
someFunction(o);

您通过为 ConstResult 创建一个公共基础 class 开始正确,但随后完全忽略了它。 你所有的问题确实都在这一行:

Result  res = (new Const(4));

首先,C++中的operator new returns是指针,不是引用。此外,这将是利用您的基础的好地方 class:

Expression* res = new Const(4);

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

这将使用 print()Const 版本。如果你想使用 Result 版本 - abstract classes 在这里对你没有帮助,你需要使用转换。在 Result 中创建自己的 operator=(Const &) 或在 Const 中创建 operator Result()

Class ResultConst是两个不同的类。这意味着类型转换

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

不可能。做你想做的事,因为 类 都继承自 Expression,做:

  Expression * res = new Result( objConst);

其中 objConst 是一个 Const 对象。

一个问题是

double point= value;

没有初始化你的成员,而是一个新的未使用的局部变量。

就这样

point = value;