0

假设我有以下代码利用 C++ 中的动态多态性

图形对象.h

class GraphicalObject
{
public:
    virtual void draw() = 0;
};

矩形.h

#include "GraphicalObject.h"

class Rectangle : public GraphicalObject
{
    void draw();
};

矩形.cpp

#include "Rectangle.h"
#include <iostream>

void Rectangle::draw() {
    std::cout << "Drawing rectangle!" << std::endl;
}

圈子.h

#include "GraphicalObject.h"

class Circle : public GraphicalObject
{
    void draw();
};

圈子.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 相关的开销。

4

1 回答 1

1

GraphicalObject* picture[2];这里的问题是得到静态类型GraphicalObject和静态多态所指向的对象使用静态类型。

但这并不意味着静态多态性不可能是类似的情况。您需要一个包装类,它知道存储对象的实际类型,并在调用方法之前将指针转换为它。

于 2021-03-03T08:32:49.037 回答