我有一个名为 shape 的抽象类。
class Shape{
public:
virtual const ColorRGB getColor() const;
virtual double rayIntersectionDistance(Ray r) = 0;
};
现在我从 Shape 派生了以下类。
class Sphere: public Shape { //implementation goes here }
class Plane: public Shape { //implementation goes here }
我在两个类中都实现了 getColor()和 rayIntersectionDistance(Ray r)方法,并使用了特定于这些类的其他方法。
现在,在另一个名为 Scene 的类中,我有一个 render()方法,它的原型是:
void render(int width, int height, Shape s);
这似乎不起作用,编译器抱怨我说:
错误:无法将参数's'声明为抽象类型'Shape'
我怎样才能实现这一目标?什么是更好的方法来实现这一目标?
答案 0 :(得分:3)
按值传递Shape
表示传递Shape
的实例。但Shape
是抽象的,因此无法创建实例。
改为传递指针或引用。 const
符合条件,如果您不打算修改传递的对象(这也会阻止传递声明为const
的对象,因为它们不应更改)。
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
}
编辑:
正如Barry在评论中提到的那样,也可以传递智能指针,例如std::unique_pointer<Shape>
或std::shared_pointer<Shape>
- 这些指针可以通过值传递。如理查德·霍奇斯(Richard Hodges)所说,这在实践中是不寻常的,尽管它是可能的。实际上,任何管理指针或Shape
引用的类型都可以传递 - 假设它的构造函数(特别是复制构造函数)实现了适当的行为。