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

Posted

技术标签:

【中文标题】继承的方法不会改变变量值【英文标题】:Inherited method doesn`t change variables values 【发布时间】:2019-06-21 11:12:47 【问题描述】:

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

尝试将 A、B、C、D 公开,因为在互联网上的大多数示例中都存在变量。

Quadrangle 的方法按预期工作。但是“类 Quadrangle 被 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 类中删除属性 A、B、C 和 D,并将 Quadrangle 类中的属性设为“受保护” @StackDanny 根本没有。 【参考方案1】:

问题是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
;

【讨论】:

我没听懂。不错的工作。这样就可以了!【参考方案2】:

首先,如果你想从后代访问类成员,那么你需要使用protected关键字,而不是private

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

在您的情况下,您声明了 2 组具有相同名称的变量,这些变量只能从相应的类中访问。

【讨论】:

【参考方案3】:

您的基类Quadrangle 没有要覆盖的方法,因为它们都没有用“virtual”关键字标记。 您现在拥有的称为重载,只有在编译时已知 Quadrangle 的类型时才会起作用。

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

virtual ~Quadrangle() = default;
virtual void init();
virtual void square();

【讨论】:

有时你不需要多态性。问题中没有任何迹象表明这里有必要(除了 OP 说“覆盖”但是我们应该对这种用法有强烈的意图/理解!)。我也认为你的意思是析构函数【参考方案4】:

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

【讨论】:

以上是关于继承的方法不会改变变量值的主要内容,如果未能解决你的问题,请参考以下文章

jsp页面判定某个变量值的时候改变颜色

关于有时候变量值类型莫名改变的情况

JavaScript不借助第三个变量交换a,b两个变量值

java在循环语句的执行语句赋予变量值循环结束后会释放吗?

怎么在debug时显示全部的变量值

如何只允许 getter/setter 获取/设置变量值? [复制]