gpt4 book ai didi

c++ - 制作以基类为参数的函数指针并发送派生类

转载 作者:行者123 更新时间:2023-11-27 23:09:47 24 4
gpt4 key购买 nike

我想制作一个接受基类参数的函数指针。我希望能够创建一个指针可以指向的函数,但让它接受派生类的参数。然后我希望能够使用派生类调用函数参数并让它执行一个函数,就好像参数是派生类一样。我希望能够做这样的事情:

void(*pointer)(Base);
class Base
{};

class Something : public Base
{
public:
float f;
int i;
};

void doSomething(Something s)
{
//do something
}


int main()
{
Something s;
pointer = doSomething;
pointer(s);

return 0;
}

我能做些什么来使这个在 C++ 中工作吗?

最佳答案

因此,换句话说,您想要一个函数,该函数接受一个 Base 对象参数,并使用该参数,就好像它实际上是一个派生对象一样。

基本上(伪代码):

void DoSomething (Base obj)
{
obj.DoSomethingWithDerived();
}

为了完成这个,你需要做两件事:

  1. 使 Base 多态。
  2. 让您的函数采用引用指针Base -- 而不是Base值(value)。

使基础多态。

C++ 中的多态类是任何至少具有 1 个 virtual 方法的类。几乎在所有情况下,你都应该有一个 virtual 析构函数(出于一些不同的原因),所以你在这里要做的就是:

class Base
{
public:
virtual ~Base() {};
};

引用或指针参数

如果你构造一个函数,它接受一个 Base 按值:

void DoSomething (Base obj)

...然后用派生对象调用它:

int main()
{
Derived der;
DoSomething (der);
}

最终发生的是 der 的拷贝将在调用 DoSomething 时生成,但拷贝不会是完整拷贝 -- 它只是一个 Base 拷贝。所有特定于 Derived 的东西都将是 sliced away .

因此,不是按值获取 Base,而是必须按引用或按指针获取 Base,这样就不会进行复制:

void DoSomething (Base& obj);

关于c++ - 制作以基类为参数的函数指针并发送派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21005988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com