C++ 如何拥有抽象数据类型的参数?

C++ 如何拥有抽象数据类型的参数?,c++,class,oop,abstract,C++,Class,Oop,Abstract,我有一个名为shape的抽象类 class Shape{ public: virtual const ColorRGB getColor() const; virtual double rayIntersectionDistance(Ray r) = 0; }; 现在,我从Shape派生了以下类 class-Sphere:public-Shape{//implementation-goes-here} 类平面:公共形状{//实现在这里} 我在这两个类中都实现了getColor(

我有一个名为shape的抽象类

class Shape{
public:
    virtual const ColorRGB getColor() const;
    virtual double rayIntersectionDistance(Ray r) = 0;
};
现在,我从Shape派生了以下类

  • class-Sphere:public-Shape{//implementation-goes-here}
  • 类平面:公共形状{//实现在这里}
  • 我在这两个类中都实现了getColor()rayIntersectionDistance(Ray r)方法,以及特定于这些类的其他方法

    现在,在另一个名为Scene的类中,我有一个render()方法,它的原型是:

    void render(int width, int height, Shape s);
    
    这似乎不起作用,编译器抱怨我说:

    错误:无法将参数“s”声明为抽象类型“Shape”


    我怎样才能做到这一点?实现这一点的更好方法是什么?

    通过值传递
    形状
    意味着传递
    形状
    的实例。但是
    Shape
    是抽象的,因此无法创建实例

    而是传递指针或引用<如果不希望修改传递的对象,则代码>常量符合条件(这也将阻止传递声明为
    常量
    的对象,因为它们不应更改)

    编辑:


    正如Barry在评论中提到的,还可以传递智能指针,例如
    std::unique_pointer
    std::shared_pointer
    ——这些指针可以通过值传递。正如理查德·霍奇斯(Richard Hodges)提到的那样,这在实践中是不寻常的,尽管这是可能的。事实上,任何管理
    Shape
    指针或引用的类型都可以传递,前提是其构造函数(特别是复制构造函数)实现了适当的行为。

    func4(unique_ptr)
    func5(shared_ptr)
    ,…;-)@巴里公平地说,将移动的唯一ptr传递给抽签功能是不寻常的@彼得我可能不会鼓励
    func()
    func2()
    。太可恶了
    func3()
    就是那个。@Barry-是的。也可以传递任何包含指针或对
    形状
    的引用的类型,包括您提到的智能指针类型,只要该类型适当地管理其状态。@Richard-如果函数需要更改
    形状
    的状态,
    常量
    是不合适的。考虑一个<代码> RooTestObjt(Stand &),它更新形状的定义点(顶点、中心等)的坐标,即使这是通过调用< <代码> const 成员函数>代码>形状<代码>来完成的。这不能接受一个
    常量
    @Peter在一般情况下你当然是对的。我想我在评论的时候仍然考虑到老年退休金计划的问题。他给出的例子是非变异函数。
     void func(Shape &s);    // define these functions as required
     void func2(Shape *s);
     void func3(const Shape &s);
    
     int main()
     {
            Sphere s;   // assumed non-abstract
    
            const Sphere s2;
    
            func(s);     // will work
            func2(&s);    // ditto
    
            func3(s);   // okay
            func3(s2);  // okay
    
            func(s);   // rejected, as s2 is const
     }