基类和子类函数继承混淆(C)


Base and child class function inheritance confusion (C++)

我对基类和子类函数继承感到很困惑。
我有这些课程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <point.h>

class Polygon{
public:
    Polygon();
    virtual ~Polygon();
    void addPoint(Point *p);
    std::string getType();
    Point* getPoint(int index);
    int getNumOfPoints();
    int getColor();
    virtual int area()=0;

private:
  std::vector<Point*> _points;

  int color;
  std::string type ="Polygon";

};

class Rectangle : public Polygon{
public:
    Rectangle();
    virtual ~Rectangle();
    virtual int area();

private:
    std::vector<Point*> _points;

    int color;
    std::string type ="Rectangle";
};

现在,我主要这样做:

1
2
Rectangle rect();
rect.getType();

这给了我"多边形",而我想要"矩形"
我很确定我对继承感到困惑。所以,根据我的理解,基类函数是被继承的,但是为什么当我运行它与对象基类的成员而不是实际对象(矩形)相关的函数时呢?

如果有人愿意帮忙,我会很高兴!
非常感谢


发生的是 Rectangle::typePolygon::type 完全无关。它是一个单独的数据成员,恰好具有相同的名称。

实现预期效果的一种方法是将 getType() 设为虚拟并在每个派生类中覆盖它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Polygon {
public:
    virtual std::string getType() = 0;
    ...
}

class Rectangle: public Polygon {
public:
    virtual std::string getType();
    ...
}

std::string Rectangle::getType() {
    return"Rectangle";
}


你只需要一个地方的类型字符串——你的基类。因为您希望它可以在您的派生类中访问,但不能被您的用户访问,所以使其受到保护。在每个构造函数中,将其设置为适当的值:

1
2
3
4
5
6
7
8
9
Polygon::Polygon():
        type("polygon")
{}

Rectangle::Rectangle()
    Polygon()
{
    type ="rectangle";
}

您在 Rectangle 的实例中有两个名为 type 的成员。由于 Polygon 的私有成员只能由该类的成员函数访问,因此在 Rectangle 中以相同名称声明成员时就好像它们不存在一样。它甚至不是正确的阴影,因为在 Rectangle 中,将无法访问 Polygontype 成员。所以 Polygon::getType 返回 Polygon 中定义的 type 而不是 Rectangle.

中定义的不相关的

您有几种方法可以解决您的问题:

  • type 定义为 Polygon 中的受保护成员,并在每个构造函数中分配给它。
  • 删除 type;将 getType 声明为虚拟并在每个类中覆盖它,返回一个常量字符串。
  • 将 RTTI 用于它的好处:找出对象的实际类。
  • 设计你的程序,这样你就不需要告诉对象的确切类型。这通常是最好的。每次你需要为 Polygon 的不同子类提供不同的行为时,编写一个实现特定行为的虚成员函数。