【问题标题】:C++ inherited class designC++继承类设计
【发布时间】:2023-01-12 18:34:15
【问题描述】:

我正在尝试实现一个 Shape 类,它是几个形状的基类,如圆形、方形、直线等。 我应该如何为不常见的界面功能创建这种设计?例如,当我想为圆设置半径时,我必须编写一个 setRadius() 函数,但如果不将我的 Shape 指针转换为 Circle 指针,我将无法调用该函数。强制转换指针以访问派生类函数是个好主意吗?还是我应该用另一种方式来处理它?

class IShape {
    virtual void getArea() = 0;
    virtual void getPerimeter() = 0;
};

class Circle: public IShape {
    void setRadius(int radius)
    {
    //...
    }
};

int main ()
{
    IShape *circlePtr = new Circle;
    static_cast<Circle>(circlePtr)->setRadius(10);
}

那是我的实现,以这种方式实现它是个好主意吗?

【问题讨论】:

    标签: c++ inheritance casting


    【解决方案1】:

    我认为正确的做法是只使用接口变量中的通用接口函数,而使用特定变量中的特定函数。

    在你的例子中:

    int main ()
    {
        Circle *circlePtr = new Circle;
        circlePtr->setRadius(10);
    }
    

    如果你仍然想要接口行为,你别无选择,只能提供一个方法来说明某事是否可行,例如hasRadiuscanSetRadius,然后接口中的其他函数以此为前提。但是你基本上是在破坏你自己的接口抽象。这没有多大意义。

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2012-08-10
      相关资源
      最近更新 更多