Если у вас есть базовый класс A
и производный класс B
, вы можете сделать следующее.
void wantAnA(A myA)
{
// work with myA
}
B derived;
// work with the object "derived"
wantAnA(derived);
Теперь для метода wantAnA
нужна копия derived
, Однако объект derived
не может быть полностью скопирован, так как класс B
может изобретать дополнительные переменные-члены, которые не находятся в его базовом классе A
.
Поэтому, чтобы вызвать wantAnA
, компилятор будет «срезать» все дополнительные члены производного класса. Результатом может быть объект, который вы не хотите создавать, потому что
A
(все особые поведения класс B
теряется). glewInit()
должен вызываться после того, как контекст OpenGL становится актуальным, после glfwMakeContextCurrent
.
Но он должен вызываться перед любой инструкцией OpenGL. См. Также Инициализация GLEW :
// [...]
/* Make the window's context current */
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
printf("Error\n");
float pos[6] = {
-0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
GLuint buf;
glGenBuffers(1, &buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), pos, GL_STATIC_DRAW);
// [...]
Обратите внимание, что инструкции, подобные glGenBuffers
, являются функциональными указателями. Эти указатели инициализированы в NULL
. glewInit()
присваивает адрес функции этим указателям.
Когда вы пытаетесь вызвать функцию перед инициализацией, это вызывает:
Нарушение прав доступа, местоположение выполнения 0x00000000
blockquote>