继承方法不改变变量值
Inherited method doesn`t change variables values
继承方法 init() 在新 class 中不起作用。 A、B、C、D 值保持不变,因此重写的 square() 方法也不起作用。
尝试将 A、B、C、D 移动到 public,因为在 Internet 上的大多数示例中都存在变量。
Quadrangle 的方法按预期工作。但是 "class Quadrangle is underlined by IDE: "这个声明没有存储 class 或类型说明符。虽然程序没有崩溃。
此外,我是否以正确的方式覆盖了 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;
};
英语不是我的第一,而且我没有谈论编程的经验。抱歉,如果有什么问题。
首先,如果你想从后代访问 class 成员,那么你需要使用 protected
关键字,而不是 private
.
其次,您不需要在后代中声明相同的变量。
在你的例子中,你声明了 2 组具有相同名称的变量,这些变量只能从相应的 classes 访问。
问题是 Rectangle
定义了每个成员变量的另一个副本:
class Quadrangle
{
...
point A, B, C, D;
};
class Rectangle : public Quadrangle
{
...
point A, B, C, D;
};
自然Quadrangle
的方法访问Quadrangle::A
、Quadrangle::B
等,而Rectangle
的方法访问Rectangle::A
、Rectangle::B
,等等,一组完全独立的变量。
相反,您应该只在 Quadrangle
中定义变量并将它们标记为 protected
(以便 Rectangle
可以访问它们):
class Quadrangle
{
...
protected:
point A, B, C, D;
};
class Rectangle : public Quadrangle
{
...
// no variables
};
您的基础 class Quadrangle
没有可覆盖的方法,因为其中 none 个标记有 'virtual' 关键字。
您现在拥有的称为重载,只有在编译时知道 Quadrangle 的类型时才会起作用。
并记住:作为一个好的经验法则,如果 class 有任何虚拟方法,请确保析构函数也是虚拟的:
virtual ~Quadrangle() = default;
virtual void init();
virtual void square();
要解决问题的第二部分:要在多态性意义上进行覆盖,您需要将两个方形函数都声明为虚拟函数。
继承方法 init() 在新 class 中不起作用。 A、B、C、D 值保持不变,因此重写的 square() 方法也不起作用。
尝试将 A、B、C、D 移动到 public,因为在 Internet 上的大多数示例中都存在变量。
Quadrangle 的方法按预期工作。但是 "class Quadrangle is underlined by IDE: "这个声明没有存储 class 或类型说明符。虽然程序没有崩溃。
此外,我是否以正确的方式覆盖了 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;
};
英语不是我的第一,而且我没有谈论编程的经验。抱歉,如果有什么问题。
首先,如果你想从后代访问 class 成员,那么你需要使用 protected
关键字,而不是 private
.
其次,您不需要在后代中声明相同的变量。
在你的例子中,你声明了 2 组具有相同名称的变量,这些变量只能从相应的 classes 访问。
问题是 Rectangle
定义了每个成员变量的另一个副本:
class Quadrangle
{
...
point A, B, C, D;
};
class Rectangle : public Quadrangle
{
...
point A, B, C, D;
};
自然Quadrangle
的方法访问Quadrangle::A
、Quadrangle::B
等,而Rectangle
的方法访问Rectangle::A
、Rectangle::B
,等等,一组完全独立的变量。
相反,您应该只在 Quadrangle
中定义变量并将它们标记为 protected
(以便 Rectangle
可以访问它们):
class Quadrangle
{
...
protected:
point A, B, C, D;
};
class Rectangle : public Quadrangle
{
...
// no variables
};
您的基础 class Quadrangle
没有可覆盖的方法,因为其中 none 个标记有 'virtual' 关键字。
您现在拥有的称为重载,只有在编译时知道 Quadrangle 的类型时才会起作用。
并记住:作为一个好的经验法则,如果 class 有任何虚拟方法,请确保析构函数也是虚拟的:
virtual ~Quadrangle() = default;
virtual void init();
virtual void square();
要解决问题的第二部分:要在多态性意义上进行覆盖,您需要将两个方形函数都声明为虚拟函数。