在c++中使用dynamic_cast的替代方案
Alternative to using dynamic_cast in C++
我有这些类:
class Field{
public:
int X;
void validate(){
validator->validate(this);
}
void setValidator(Validator* v){
validator = v;
}
private:
Validator* validator;
};
class DerivedField : public Field{
public:
int Y;
}
class Validator {
public:
virtual void validate(Field*); // do something with Field.X
};
class DerivedValidator : public Validator {
virtual void validate(Field*); //do something with DerivedField.Y
};
我想这样做:
DerivedValidator* v = new DerivedValidator();
DerivedField* f = new DerivedFiled();
f->setValidator(v);
f->validate(); // Error, Validator::validate called instead of DerivedValidator::validate
既然它不工作,我能做些什么来避免这个:
class DerivedValidator{
void validate(Field* f){
DerivedField* dv = dynamic_cast<DerivedField*>(f);
// do something with dv.Y
}
};
谢谢。编辑:好吧,所有的"bug"现在都修复了。
首先,通过更改方法签名,您创建了一个将隐藏基类签名的新方法。你需要让DerivedValidator的validate()方法只接受一个Field*参数。
然后,一旦你在你的方法中添加了virtual关键字,当你传入一个DerivedField时,正确的方法应该被调用。
您仍然无法访问DerivedField的继承值,因为您没有告诉基类有关派生类的任何信息。例如,Field知道所有关于Validator的类型,但是不知道什么是DerivedValidator。无论您想在派生类中访问什么,都必须通过基类签名。
它不工作是好的,因为DerivedField不继承Field。如果你想破解,你可以使用c风格的强制转换。
与其为字段和验证器创建并行的类层次结构,不如这样设计:
class Field{
public:
int X;
virtual bool validate(Validator* v){
return (v->isValid(X));
}
}
class DerivedField : public Field{
public:
int Y;
virtual bool validate(Validator* v){
return (v->isValid(X) && v->isValid(Y));
}
}
每个派生的Validator类对于什么是有效的、什么是无效的都有不同的想法。
你的代码充满了小错误。首先,你的类没有派生自任何东西,我假设DerivedField
继承自Field
, DerivedValidator
继承自Validator
。其次,你需要写validator->validate
,因为它是一个指针。第三,Field::validate
没有参数,但你调用f->validate(v
)。如果这些错误得到纠正,那么您唯一要做的就是使Validator::validate
虚拟并使用您提出的解决方案(与dynamic_cast
一起)。
您需要将Validator::validate()设为虚拟
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?