gpt4 book ai didi

c++ - 基类指针,基于派生类型调用方法

转载 作者:行者123 更新时间:2023-11-30 02:38:33 26 4
gpt4 key购买 nike

我知道以下代码不起作用——无法将 base 转换为 foo。

有什么我可以做的,或者可以采用的某种模式可以让我关闭我试图在下面的代码中实现的行为吗? IOW,如果我有一个指向派生类型的基类指针,我如何调用与派生类型(而不是基类型)匹配的特定方法?

我可以使用哪些模式?我研究了 Curiously Recursive (or recurring) Template Pattern,但是这本身就强加了其他限制。

class base {};
class foo : public base {};
void method(const foo& f){}
int main(){
base* b = new foo();
method(*b);
}

最佳答案

最简单的方法可能是让 method() 成为 foo 上的 virtual 成员函数:

class base { 
public:
virtual void method() const = 0;
};
class foo : public base {
public:
void method() const override { }
};

int main(){
foo f;
base* b = &f;
b->method();
}

但如果出于某种原因这是不可能的(也许您无权访问 method() 或者您可能想将逻辑保留在 method() 中与 foo 分开)你可以使用 Visitor Pattern 的简化版本.

访问者模式依赖于层次结构中的所有类都具有根据类类型进行分派(dispatch)的虚函数。

在你的情况下你不需要双重调度所以你实际上不需要访问者对象并且可以直接从虚拟 dispatch 调用你的 method 函数功能:

class base { 
public:
virtual void dispatch() const = 0;
};
class foo : public base {
public:
void dispatch() const override;
};

void method(const foo& f){}

void foo::dispatch() const {
method(*this);
}

int main(){
foo f;
base* b = &f;
b->dispatch();
}

你必须记住,在大多数情况下,编译器不知道你的 base 指针实际上是 foo 类型。

关于c++ - 基类指针,基于派生类型调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744108/

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