C++ 多态性:如何编写函数来接受任何抽象 class 实现

C++ Polymorphism: How to write function to accept any abstract class implementation

我希望能够将抽象 class 的任何实现传递到单独文件中定义的函数中,以便我可以将功能用于其他项目并编写子 class但是它适合我。

main.cpp:

#include "my_process.h"


struct my_guy : V2 {

    my_guy(float x, float y)
        : V2(x, y) { }

    void double_me() override {
        x *= 2.f;
        y *= 2.f;
    }
};

int main() {
    process(my_guy(1.f,2.f));

    return 0;
}

my_process.h:

#pragma once

#include <iostream>

struct V2 {
    float x, y;

    V2(float x, float y) {
        this->x = x;
        this->y = y;
    }

    virtual void double_me() {  }
};

std::ostream& operator<<(std::ostream& output_stream, V2 vector) {
    output_stream << vector.x << ", " << vector.y;
    return output_stream;
}

void process(V2 vector) {
    vector.double_me();

    std::cout << vector << std::endl;
}

上面的例子打印了 1,2 而不是预期的 2,4

您的函数 process 当前传递的是按值传递的参数。

因为您当前是按值传递的,所以创建了一个新的 V2 值作为参数,它的类型始终为 V2 并像 V2.

将其更改为对传递给它的任何对象进行 引用

void process(V2 & vector)

由于参数也被修改,您将需要传递一个命名变量来让 C++ 编译器相信您没有意外修改临时变量。

int main() {
    auto guy = my_guy(1.f,2.f);
    process(guy);
}