如何在 C++ 中用静态多态替换动态多态?
How to in C++ substitute the dynamic polymorphism by the static one?
假设我有以下代码利用 C++ 中的动态多态性
GraphicalObject.h
class GraphicalObject
{
public:
virtual void draw() = 0;
};
Rectangle.h
#include "GraphicalObject.h"
class Rectangle : public GraphicalObject
{
void draw();
};
Rectangle.cpp
#include "Rectangle.h"
#include <iostream>
void Rectangle::draw() {
std::cout << "Drawing rectangle!" << std::endl;
}
Circle.h
#include "GraphicalObject.h"
class Circle : public GraphicalObject
{
void draw();
};
Circle.cpp
#include "Circle.h"
#include <iostream>
void Circle::draw() {
std::cout << "Drawing circle!" << std::endl;
}
主要
int main(int argc, char** argv) {
Rectangle rectangle;
Circle circle;
GraphicalObject* picture[2];
picture[0] = &rectangle;
picture[1] = &circle;
for(GraphicalObject* o : picture) {
o->draw();
}
return 0;
}
我的问题是是否有可能如何拥有 picture
数组
没有动态多态性,而不是仅使用静态多态性和
避免虚拟方法?我想避免使用虚拟方法的原因是我想避免与访问 vtable 相关的开销。
这里的问题是 GraphicalObject* picture[2];
指向的对象是静态类型 GraphicalObject
而静态多态性使用静态类型。
但这并不意味着静态多态性在类似情况下是不可能的。您需要一个包装器 class,它知道存储对象的实际类型,并在调用方法之前将指针转换为它。
假设我有以下代码利用 C++ 中的动态多态性
GraphicalObject.h
class GraphicalObject
{
public:
virtual void draw() = 0;
};
Rectangle.h
#include "GraphicalObject.h"
class Rectangle : public GraphicalObject
{
void draw();
};
Rectangle.cpp
#include "Rectangle.h"
#include <iostream>
void Rectangle::draw() {
std::cout << "Drawing rectangle!" << std::endl;
}
Circle.h
#include "GraphicalObject.h"
class Circle : public GraphicalObject
{
void draw();
};
Circle.cpp
#include "Circle.h"
#include <iostream>
void Circle::draw() {
std::cout << "Drawing circle!" << std::endl;
}
主要
int main(int argc, char** argv) {
Rectangle rectangle;
Circle circle;
GraphicalObject* picture[2];
picture[0] = &rectangle;
picture[1] = &circle;
for(GraphicalObject* o : picture) {
o->draw();
}
return 0;
}
我的问题是是否有可能如何拥有 picture
数组
没有动态多态性,而不是仅使用静态多态性和
避免虚拟方法?我想避免使用虚拟方法的原因是我想避免与访问 vtable 相关的开销。
这里的问题是 GraphicalObject* picture[2];
指向的对象是静态类型 GraphicalObject
而静态多态性使用静态类型。
但这并不意味着静态多态性在类似情况下是不可能的。您需要一个包装器 class,它知道存储对象的实际类型,并在调用方法之前将指针转换为它。