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);
}
我希望能够将抽象 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);
}