使用接口和抽象类

时间:2013-05-06 23:04:36

标签: c++

我在使用c ++中的接口时遇到了一些麻烦。我目前正在学习OpenGL,我想编写一个小的OOP抽象层。

#ifndef SHADER_H
#define SHADER_H

#include<glload/gl_core.h>
#include<string>
#include "filereader.h"
class IShader
{

public:
    virtual ~IShader(){}
    virtual void setShaderSource(std::string path) = 0;
    virtual bool createShader()= 0;
    virtual GLuint getHandle()= 0;
    virtual GLenum getShadertype()=0;
};
class BaseShader : public IShader
{

    GLuint shaderObj;
    std::string shaderSource;

public:

    virtual ~BaseShader();
    void setShaderSource(std::string path);
    bool createShader();
    GLuint getHandle();
    virtual GLenum getShadertype()=0;
};
class VertexShader : public BaseShader{
   public:

    GLenum getShadertype(){
        return GL_VERTEX_SHADER;
    }
};

class FragmentShader : public BaseShader{
public:
    GLenum getShadertype(){
        return GL_FRAGMENT_SHADER;
    }
};

class IShaderProgram{
public:
    virtual void attachShader(IShader &s) = 0;
    virtual void link() = 0;
    virtual void use()=0;
};

#endif // SHADER_H

如您所见,我创建了一个IShader接口和一个名为BaseShader的抽象类。现在我想在BaseShader中实现除getShadertype()之外的所有方法。

但我不知怎的被迫在BaseShader中实现getShadertype()。如果我不这样做,我会得到一个未定义的引用错误。

这是我的shader.cpp

#include "shader.h"

GLenum BaseShader::getShadertype(){
    return GL_VERTEX_SHADER; // I really don't want to implement getShadertype here
}

bool BaseShader::createShader(){
    BaseShader::shaderObj = glCreateShader(BaseShader::getShadertype());
    GLint length[1];
    length[0] = BaseShader::shaderSource.size();
    const GLchar* p[1];
    p[0] = BaseShader::shaderSource.c_str();
    glShaderSource(BaseShader::getHandle(),1,p,length);

    GLint success;
    glGetShaderiv(BaseShader::getHandle(), GL_COMPILE_STATUS, &success);
        if (!success) {
            return false;
        }
    return true;


}
void BaseShader::setShaderSource(std::string path){
    FileReader fileReader(path);
    BaseShader::shaderSource = fileReader.get();
}

GLuint BaseShader::getHandle(){
    return BaseShader::shaderObj;
}

如何告诉c ++我只想在VertexShader,FragmentShader等中实现getShadertype()

我可能搞砸了很多东西,例如我甚至无法实例化Vertex或FragmentShader,但我可能应该问另一个问题。

1 个答案:

答案 0 :(得分:3)

当函数为pure virtual= 0)时,所有子类都必须实现它才能实例化。一个或多个纯虚函数使类抽象,这意味着它无法实例化。如果子类没有实现抽象基类中的所有纯虚函数,它们也会变成抽象的。

如果您不想要纯虚函数,请删除= 0