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(); |
这给了我"多边形",而我想要"矩形"
我很确定我对继承感到困惑。所以,根据我的理解,基类函数是被继承的,但是为什么当我运行它与对象基类的成员而不是实际对象(矩形)相关的函数时呢?
如果有人愿意帮忙,我会很高兴!
非常感谢
发生的是
实现预期效果的一种方法是将
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"; } |
您在
中定义的不相关的
您有几种方法可以解决您的问题:
-
将
type 定义为Polygon 中的受保护成员,并在每个构造函数中分配给它。 -
删除
type ;将getType 声明为虚拟并在每个类中覆盖它,返回一个常量字符串。 - 将 RTTI 用于它的好处:找出对象的实际类。
-
设计你的程序,这样你就不需要告诉对象的确切类型。这通常是最好的。每次你需要为
Polygon 的不同子类提供不同的行为时,编写一个实现特定行为的虚成员函数。