构造函数C++中的虚拟方法
Virtual method in constructor C++
我有一个类Shader
,在它的构造函数中,有编译着色器,绑定属性然后链接着色器程序的语句。问题是我希望子类具有不同的属性,但这必须在链接之前发生。虚拟方法在这里不起作用。我该怎么办?
Shader::Shader(const char* v, const char* f) {
program = glCreateProgram();
const char* vsrc = nullptr;
const char* fsrc = nullptr;
tls::readTextFile(std::ifstream(v, std::ios::binary), vsrc);
tls::readTextFile(std::ifstream(f, std::ios::binary), fsrc);
m_vertShader = compile(vsrc, GL_VERTEX_SHADER);
m_fragShader = compile(fsrc, GL_FRAGMENT_SHADER);
glAttachShader(program, m_vertShader);
glAttachShader(program, m_fragShader);
bindAttribs(); // it must happen before linking, in child class too.
glLinkProgram(program);
getUniforms();
setUniforms();
}
和儿童班:
void BasicShader::bindAttribs() {
bindAttribute(0, "pos");
bindAttribute(2, "vt");
} // this method is not called
问题是您的构造函数是整体式的。将其拆分为一个"预烘焙"受保护的构造函数和一个执行链接(也受保护)的"最终构造"帮助程序函数。这样,您可以自定义在施工期间但在链接之前发生的情况。
更通用的方法是工厂函数。
据我所知,这里有两个选项:
1. 将属性作为参数传递给构造函数
Shader::Shader(const char* v, const char* f,
const std::vector<std::pair<int, std::string>> &attrs)
/* Or some simpler type with the same functionality */
{
...
for (auto &&attr : attrs)
bindAttr(attr.first, attr.second);
...
}
2. 将所有初始化从构造函数移动到单独的方法
bool Shader::initialize(const char* v, const char* f)
{
// Here you actually can use virtual methods, yay!
// ...and even report errors via return value (unless you were planning to use exceptions)
return true;
}
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 使用模板而不是虚拟方法的管道模式
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 出于什么目的,非虚拟方法将与C++一起使用?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 如何重写继承的嵌套类中存在的虚拟方法
- 私有虚拟方法有什么用?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 确保模拟的 GTest 方法覆盖虚拟方法
- CPP 继承虚拟方法解析顺序
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 用c++中的纯虚拟方法抽象模板类
- 解决虚拟方法的歧义继承的两种方法
- 没有针对完全专用模板类的外联虚拟方法定义