如何在C ++中将一个班级角色移动到另一个班级

时间:2019-02-23 17:55:02

标签: c++

我的代码输出奇怪的数字。在“返回this-> x + this-> y + this-> z;”行中,它应该输出所有这3个数字的和,但输出奇怪的数字。预期结果:11

任何人都可以帮忙吗?

代码:

#include <iostream>
#include <string>


class Point2D {

protected:
    double x,y;

public:

    Point2D() {
        std::cout << "Objekts izveidots bez parametriem." << std::endl;
    }

    void setx(double x) {
        this->x = x;
    }

    void sety(double y) {
        this->y = y;
    }

    double getsumma() {
        return this->x + this->y;
    }

    void printInfo() {
        std::cout << "Divu malu summa ir:" << getsumma() << std::endl;
    }

    ~Point2D() {
        std::cout << "Izdzests" << std::endl;
    }
};

class Point3D : public Point2D {
protected:
    double z;

public:

    Point3D() {
        std::cout << "Objekts izveidots bez parametriem." << std::endl;
    }

    void setz(double z) {
        this->z = z;
    }


    double getperimetrs() {
        return this->x + this->y + this->z;
    }

    void printInfo() {
        std::cout << "Trijstura perimentrs ir: " << getperimetrs() << std::endl;
    }

    ~Point3D() {
        std::cout << "Izdzests" << std::endl;
    }
};

int main() {

    Point2D z1;
    Point3D x1;

    z1.setx(5);
    z1.sety(3);
    x1.setz(5);

    z1.printInfo();
    x1.printInfo();

    system("pause");

}

2 个答案:

答案 0 :(得分:3)

x1中,您仅设置Z值。 X和Y处于未初始化状态。因此,添加它们时您不知道它们的值。

否则,您可能对该程序感兴趣:

#include <iostream>

class Point2D {
protected:
    double x, y;
public:
    Point2D(double x, double y) : x(x), y(y) {
        std::cout << "Objekts izveidots bez parametriem.\n";
    }

    double getsumma() const {
        return x + y;
    }

    virtual void printInfo() const {
        std::cout << "Divu malu summa ir: " << getsumma() << '\n';
    }

    virtual ~Point2D() {
        std::cout << "Izdzests\n";
    }
};

class Point3D : public Point2D {
protected:
    double z;

public:
    Point3D(double x, double y, double z) : Point2D(x, y), z(z) {
        std::cout << "Objekts izveidots bez parametriem.\n";
    }

    double getperimetrs() const {
        return getsumma() + z;
    }

    void printInfo() const override {
        std::cout << "Trijstura perimentrs ir: " << getperimetrs() << '\n';
    }

    ~Point3D() override {
        std::cout << "Izdzests\n";
    }

};

int main() {

    Point2D z1(5, 3);
    Point3D x1(5, 3, 5);

    z1.printInfo();
    x1.printInfo();
}

答案 1 :(得分:3)

继承不是这样的。

您有两个不同的,不相关的,不相关的独立对象:

  • 一个是名为Point2D的{​​{1}},其成员z1x由您设置。
  • 另一个是名为y的{​​{1}},您为其设置的成员Point3D

仅仅因为类型x1继承自z并不意味着这两个特定实例之间没有任何关系。

Point3D的{​​{1}}未设置,并且Point2D的{​​{1}}和z1未设置。这些成员未初始化,没有指定值,因此输出不可靠。

我认为您可能只是想制作一个 对象,如下所示:

z

The output is 13(5 + 3 + 5不是11)。

继承是在x1上进行xy的方式,因为这些功能是从其Point3D obj; obj.setx(5); obj.sety(3); obj.setz(5); obj.printInfo(); 继承而来的。 / p>

另一种查看方式是,每个setx内都自动(通过继承)有一个“隐藏的” sety。您不需要自己做。