继承的方法不会更改变量值

Inherited method doesn`t change variables values

本文关键字:改变 变量值 方法 继承      更新时间:2023-10-16

继承的方法init((在新类中不起作用。A、B、C、D 值保持不变,因此覆盖的 square(( 方法也不起作用。

尝试将 A、B、C、D 移动到公共环境中,因为在互联网上的大多数例子中都有变量。

四边形的方法按预期工作。但是"类四边形由 IDE 下划线:"此声明没有存储类或类型说明符"。虽然程序不会崩溃。

另外,我是否以正确的方式覆盖了square((?

#include "pch.h"
#include <iostream>
using namespace std;
struct point {
    float x, y;
};
class Quadrangle
{
public:
    void init() // sets coordinates for A, B, C, D
    {
        cout << "Input A coordinates (x, y): ";
        cin >> A.x >> A.y;
        cout << "Input B coordinates (x, y): ";
        cin >> B.x >> B.y;
        cout << "Input C coordinates (x, y): ";
        cin >> C.x >> C.y;
        cout << "Input D coordinates (x, y): ";
        cin >> D.x >> D.y;
    };
    void square()
    {
        // square calculation
    };
private:
    point A, B, C, D;
};
class Rectangle : public Quadrangle
{
public:
    void square()
    {
        // square calculation
    };
private:
    point A, B, C, D;
};

英语不是我的第一个,我没有谈论编程的经验。抱歉,如果出现问题。

问题是Rectangle定义了每个成员变量的另一个副本:

class Quadrangle
{
    ...
    point A, B, C, D;
};
class Rectangle : public Quadrangle
{
    ...
    point A, B, C, D;
};

当然,Quadrangle访问的方法Quadrangle::AQuadrangle::B等,而Rectangle访问的方法则Rectangle::ARectangle::B等,是一组完全独立的变量。

相反,您应该只在Quadrangle中定义变量并将它们标记为protected(以便Rectangle可以访问它们(:

class Quadrangle
{
    ...
    protected:
    point A, B, C, D;
};
class Rectangle : public Quadrangle
{
    ...
    // no variables
};
<</div> div class="answers">

首先,如果要访问后代中的类成员,则需要使用protected关键字,而不是private

其次,您不需要在后代中声明相同的变量。

在本例中,您声明了 2 组同名变量,这些变量只能从相应的类访问。

您的基类Quadrangle没有要重写的方法,因为它们都没有用"virtual"关键字标记。您现在拥有的称为重载,只有在编译时已知 Quadrangle 类型时才有效。

请记住:作为一个好的经验法则,如果一个类有任何虚拟方法,请确保析构函数也是虚拟的:

virtual ~Quadrangle() = default;
virtual void init();
virtual void square();
<</div> div class="answers">

要解决问题的第二部分:要在多态性意义上进行覆盖,您需要将两个平方函数声明为虚拟函数。