如何在类中使用受保护的类型继承?
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“无法访问在类中声明的受保护成员”的有效方法