如何在类中使用受保护的类型继承?

Posted

技术标签:

【中文标题】如何在类中使用受保护的类型继承?【英文标题】:How to use protected type inheritance in class? 【发布时间】:2020-05-24 07:41:16 【问题描述】:
    #include<iostream>
#include<string>
#include<cmath>
using namespace std;
class Polygon 
public:
    Polygon() 
    Polygon(int point, float length) 
        mPoint = point;
        mLength = length;
    
    ~Polygon() 
    virtual void calcPerimeter() 
        cout << "Perimeter: " << mLength * mPoint;
    
    virtual void calcArea() 
        cout << "Area: " << sqrt(3) * pow(mLength, 2) / 4;
    
protected:
    int mPoint;
    double mLength;
;

class Rectangle : public Polygon 
public:
    Rectangle() 
    Rectangle(int point, float length):mPoint(4), mLength(4 * length)
    ~Rectangle() 
    void calcPerimeter() override 
        cout << "Perimeter: " << mLength;
    
    void calcArea() override 
        cout << "Area: " << mLength * mLength;
    

;

int main() 
    Polygon pol;
    Rectangle rec(4, 10);

    cout << "--- Polygon class---" << endl;
    pol.calcPerimeter();
    pol.calcArea();
    cout << "---Rectangle class---" << endl;
    rec.calcPerimeter();
    rec.calcArea();

    return 0;

我了解到,如果父类的受保护部分作为公共继承,它在子类中就像私有一样使用。顺便说一句

Rectangle (int point, float length): mPoint (4), mLength (4 * length) 

在这部分中,我得到了一个错误,即 mPoint 和 mLength 不是非静态数据成员或 Reactangle 的基类。如果它是私有的,我不能在课堂上那样使用它吗??

如果我误会了,我希望你能告诉我哪里出了问题。感谢阅读。

【问题讨论】:

你需要通过Rectangle (int point, float length) : Polygon(point,4*length) 来构建它。我猜这个answer 非常适合您的问题。 谢谢!它工作正常。但是你能告诉我我做的方法有什么问题吗? 看到这个answer。它描述了一切。 您说明了为什么让 Rectangle 模型继承 Polygon 模型在概念上是不正确的。数学对象继承,但不是它们的 c++ 对应物。 Ducktyping 是一个更好的解决方案。 【参考方案1】:

关于能够在派生类中使用protected 数据是正确的。不过,这不是问题所在。

Rectangle (int point, float length): mPoint (4), mLength (4 * length) 

您正在初始化字段,并且只能在声明它们的类的构造函数的初始化列表中完成一次 (Polygon)。

您可以在构造函数的主体中分配它们:

Rectangle (int point, float length)

    mPoint = 4;
    mLength = 4 * length;

但更好的方法是调用基类构造函数并让它完成它的工作:

Rectangle (int point, float length):Polygon (4, 4 * length) 

所有这些都引出了一个问题,为什么你在不使用 point 时将它传递给 Rectangle 构造函数。

此外,拥有受保护字段(保护方法也可以)被广泛认为是一种不好的做法,因为一旦它们受到保护,它们就可以在继承层次结构中一路访问。最好将它们保密并提供受保护的集合方法。

【讨论】:

以上是关于如何在类中使用受保护的类型继承?的主要内容,如果未能解决你的问题,请参考以下文章

如何影响派生类中受保护的基变量

绕过错误 C2248“无法访问在类中声明的受保护成员”的有效方法

在派生类中使用受保护的说明符

如何在 javascript 类中模拟受保护的变量?

c# winform程序,我定义一个类,一个窗体,如何在类中访问一个窗体的控件。

如何在类中声明装饰器,以装饰已经装饰的继承方法?