基类指针,基于派生类型调用方法
base class pointer, invoke method based on derived type
我明白下面的代码不能工作——不能将base转换为foo。
是否有一些我能做的,或者一些模式来采用,这将使我接近的行为,我想在下面的代码中实现?那么,如果我有一个指向派生类型的基类指针,如何调用与派生类型(而不是基类型)匹配的特定方法呢?
我可以使用什么模式?我研究了奇怪的递归(或循环)模板模式,然而这本身也带来了其他限制。
class base {};
class foo : public base {};
void method(const foo& f){}
int main(){
base* b = new foo();
method(*b);
}
最简单的方法可能是让method()
成为virtual
在foo
上的成员函数:
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
分开),你可以使用简化版本的访问者模式。
访问者模式依赖于层次结构中的所有类都有一个基于类类型的虚函数来分派。
在你的情况下,你不需要双重调度,所以你实际上不需要访问者对象,你可以直接从虚拟的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
类型的。
使用virtual
函数来解决这类问题:
class base {
public:
virtual void func() const { /* A */ }
};
class foo : public base {
public:
void func() const override { /* B */ }
};
void method(const base& f) {
f.func();
}
int main(){
base* b = new foo();
method(*b);
}
现在,根据f
的实际类型,A
或B
代码将在method
中执行。
相关文章:
- 在 C++ 中用派生类型重写成员函数
- 在 C++ 中将对象转换为派生类型
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 返回派生类型时出现协变类型错误
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 基于派生类型的编译时行为分支
- 按类型排序向量并按类型或派生类型搜索
- 为什么"运算符<<"不适用于指向派生类型的成员?
- 无法返回派生类型的标准::unique_ptr<>
- 无法从派生类型的作用域访问另一个实例的受保护成员
- dynamic_cast到具有未知模板参数的派生类型
- 派生类型的成员
- 视觉C++ dynamic_cast返回 NULL,尽管对象是派生类型
- 在运算符中动态强制转换为派生类型<<
- 如何在不转换回基类类型的情况下返回派生类型的对象?
- 将派生指针分配给C 中的其他派生类型
- 如何将派生类型的对象放在用于基本类型的向量中
- C++ - 无法将派生类型作为基类型列表传递给构造函数
- 如何在基本类型参考中存储对派生类型的参考
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?