C++中的静态多态性
Static polymorphism in C++
#include <iostream>
template<typename Impl>
struct renderer{
void get(){
static_cast<Impl*>(this)->get();
}
};
struct open_gl : public renderer<open_gl>{
void get(){
std::cout << "OpenGL" << std::endl;
}
};
struct direct_draw : public renderer<direct_draw>{
void get(){
std::cout << "DX" << std::endl;
}
};
template<typename T>
void print_renderer(renderer<T> r){
r.get();
}
int main() {
auto gl = open_gl();
auto dx = direct_draw();
print_renderer(gl);
print_renderer(dx);
}
为什么我不能将print_renderer的参数更改为
void print_renderer(const renderer<T> &r)
?cannot convert 'this' pointer from 'const renderer<open_gl>' to 'renderer<open_gl> &'
`为什么当我重命名方法时出现运行时错误
get
open_gl得到1?这不应该触发编译器错误吗?Error = Stack overflow
**注意我正在使用最新的 MSVC
1(因为get
不是一个const
成员函数:它不能承诺不修改你的(const(参数。
你可以将get
声明为 const
,并且编译良好:
void get() const { ... }
2(将调用基本get
方法,进入无限递归:堆栈溢出。
如果你声明你的函数override
(它必须是虚拟的(,如果编译器没有真正覆盖基方法,它将抛出错误:
void get1() override { ... } // Compiler error
void get() override { ... } // Ok
注意:
标题是"C++中的静态多态性",但我认为您误解了什么是静态多态性:它没有(必须(利用继承(就像您所做的那样(。相反,模板编译时鸭子类型将静态地"解析"函数调用。
也就是说,你不需要相关类型,你根本不需要基renderer
类,你可以简单地执行以下操作(在这种情况下,重命名为get1
将导致编译器错误(:
#include <iostream>
struct open_gl {
void get(){
std::cout << "OpenGL" << std::endl;
}
};
struct direct_draw {
void get(){
std::cout << "DX" << std::endl;
}
};
template<typename T>
void print_renderer(T r){
r.get();
}
int main() {
auto gl = open_gl();
auto dx = direct_draw();
print_renderer(gl);
print_renderer(dx);
}
现场演示
get
没有标记为const
。- 因为使用了基类方法(与强制转换无关(,并且它进入无限循环。
相关文章:
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- C++结合静态和动态多态性来创建"Hyper Polymorphism"?
- 关于 CRTP 静态多态性的困惑
- 混合双重调度和静态多态性
- CRTP 静态多态性:是否可以用模拟替换基类
- 自动复制=按值并支持多态性的适当类型的非静态字段
- 多态性:通过类文本或对象访问静态成员
- 将静态访问者与静态多态性层次结构相耦合
- 静态多态性和方法名称 c++
- 静态多态性策略和CRTP有什么区别
- 静态多态性与boost变体单访问者与多访问者与动态多态性
- 静态多态性问题
- 静态多态性中的纯抽象函数等价物是什么
- 使用CRTP在静态多态性中模拟纯虚拟函数是可能的
- C++静态多态性背后的动机是什么?
- 静态成员变量在C++中如何与多态性一起表现
- C++类的静态数据成员上的多态性
- 为什么AbstractFactoryUnit具有动态多态性而不是静态多态性
- C++中的静态多态性
- c++中方法和对象选择的静态多态性