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{ private: int color; }; class Rectangle : public Polygon{ private: int color; |
现在,我主要这样做:
1
2 |
Rectangle rect();
rect.getType(); |
这给了我”多边形”,而我想要”矩形”
我很确定我对继承感到困惑。所以,根据我的理解,基类函数是被继承的,但是为什么当我运行它与对象基类的成员而不是实际对象(矩形)相关的函数时呢?
如果有人愿意帮忙,我会很高兴!
非常感谢
- 查看 private 和 protected 类访问修饰符之间的区别。
- 当你在它的时候,查找多态性是如何工作的。一旦融入其中,然后使 getType() 成为基类和派生类中的虚拟成员,并为该类返回适当的值。
发生的是 Rectangle::type 与 Polygon::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 { std::string Rectangle::getType() { |
- 那么,我如何设计子类继承函数但实际上在 CHILD CLASS 成员上工作?
- 要实现多态行为,请使用虚函数。请参阅扩展答案。
你只需要一个地方的类型字符串——你的基类。因为您希望它可以在您的派生类中访问,但不能被您的用户访问,所以使其受到保护。在每个构造函数中,将其设置为适当的值:
1
2 3 4 5 6 7 8 9 |
Polygon::Polygon():
type(“polygon”) {} Rectangle::Rectangle() |
您在 Rectangle 的实例中有两个名为 type 的成员。由于 Polygon 的私有成员只能由该类的成员函数访问,因此在 Rectangle 中以相同名称声明成员时就好像它们不存在一样。它甚至不是正确的阴影,因为在 Rectangle 中,将无法访问 Polygon 的 type 成员。所以 Polygon::getType 返回 Polygon 中定义的 type 而不是 Rectangle.
中定义的不相关的
您有几种方法可以解决您的问题:
- 将 type 定义为 Polygon 中的受保护成员,并在每个构造函数中分配给它。
- 删除 type;将 getType 声明为虚拟并在每个类中覆盖它,返回一个常量字符串。
- 将 RTTI 用于它的好处:找出对象的实际类。
- 设计你的程序,这样你就不需要告诉对象的确切类型。这通常是最好的。每次你需要为 Polygon 的不同子类提供不同的行为时,编写一个实现特定行为的虚成员函数。
来源:https://www.codenong.com/13554828/