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(); |
这给了我”多边形”,而我想要”矩形”
我很确定我对继承感到困惑。所以,根据我的理解,基类函数是被继承的,但是为什么当我运行它与对象基类的成员而不是实际对象(矩形)相关的函数时呢?
如果有人愿意帮忙,我会很高兴!
非常感谢
发生的是
实现预期效果的一种方法是将
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() { |
你只需要一个地方的类型字符串——你的基类。因为您希望它可以在您的派生类中访问,但不能被您的用户访问,所以使其受到保护。在每个构造函数中,将其设置为适当的值:
1
2 3 4 5 6 7 8 9 |
Polygon::Polygon(): type("polygon") {} Rectangle::Rectangle() |
您在
中定义的不相关的
您有几种方法可以解决您的问题:
-
将
type 定义为Polygon 中的受保护成员,并在每个构造函数中分配给它。 -
删除
type ;将getType 声明为虚拟并在每个类中覆盖它,返回一个常量字符串。 - 将 RTTI 用于它的好处:找出对象的实际类。
-
设计你的程序,这样你就不需要告诉对象的确切类型。这通常是最好的。每次你需要为
Polygon 的不同子类提供不同的行为时,编写一个实现特定行为的虚成员函数。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/268948.html