【发布时间】:2018-11-26 10:40:21
【问题描述】:
已经有类似的问题了,但是没有回答我的问题,所以我再问一遍。
我有这些课程:
#ifndef _OBJECTS_H
#define _OBJECTS_H
#include "ray.h"
#include <cmath>
class Object {
public:
Vector3 position, color;
Object(Vector3 position, Vector3 color): position(position), color(color){};
virtual bool intersects() = 0;
};
class Sphere : public Object {
public:
float radius;
Sphere(Vector3 center, float radius, Vector3 color): Object(center, color), radius(radius){};
using Object::intersects;
bool intersects(const Ray& ray, float& t);
};
#endif
我需要有std::vector 的对象并遍历它:
for(Object s:objects) {
float t;
if (s.intersects(ray, t)) {
//do something
}
}
当我将intersects() 声明为pure virtual 时,它告诉我我不能遍历虚拟类,如果我只将它声明为virtual,那么它告诉我没有实现相交。我做错了什么?
【问题讨论】:
-
一开始就不能有
std::vector<Object>... -
_OBJECTS_H是保留标识符。通过定义它,您的程序将具有未定义的行为。 -
@user2079303 您能否提供此声明的来源?谢谢。
-
@KillzoneKid -- “每个包含双下划线 _ 或以下划线后跟大写字母 (2.12) 的名称都保留给实现以供任何使用。” [global.names]/1.
-
@PeteBecker 谢谢。它的措辞给人的印象是_OBJECTS_H 是一个现有的全局标识符,而不是因为它以_O 开头。然而,对于双下划线的使用存在一些歧义。我看到标准中的引号暗示只有开头的
__被保留,而您发布的引用表明在任何地方使用双下划线都是保留的,句号。
标签: c++ inheritance abstract-class overriding pure-virtual