Dynamic_Cast in C++
Dynamic_Cast in C++
对于正确的OOD,我很少需要使用dynamic_cast,但我将在下面的示例中使用它。这是正确的方法吗?Long和Double类是Numerics的代码思想,我希望能够添加Numerics,包括像main()中所示的Double和Long的混合。
class Numeric{
virtual Numeric& (const Numeric& num)=0;
}
class Double: public Numeric{
double data;
Numeric& operator+(const Numeric& num){
//if Double type
if(Double* d = dynamic_cast<Double *>(num)){
return Double(data+(Double &)num.data);
}
else{ //must be Long
return (doLongDoubleMath());
}
}
}
class Long: public Numeric{
long data;
Numeric& operator+(const Numeric& num){
}
}
int main(){
Numeric &n1 = Double(1.1);
Numeric &n2 = Long(10);
Numeric &result = n1+n2;
return 0;
}
我希望能够混合不同的类型,比如添加Double和Long。。等等,Dynamic_cast是正确的方法吗,或者你能想出更好的方法吗?
问题是,您需要在两个对象上多态,而不是一个。动态铸造是解决这个问题的一种方法,但我认为还有更好的方法:双重调度:
class Foo;
class Bar;
class Base {
public:
virtual Base& operator+(const Base& other) = 0;
protected:
virtual Base& addTo(Foo& other) const = 0;
virtual Base& addTo(Bar& other) const = 0;
}
class Foo : public Base {
public:
virtual Base& operator+(const Base& other) {
return other.addTo(*this);
}
}
...
当然,这意味着您必须编写N^2
addTo()
函数,其中N
是您希望能够互换添加的类的数量。但它与您需要编写的if(Foo& foo = dynamic_cast<Foo&>(other)) {...}
子句的计数相同。
双重调度可能更快,因为else if()
梯形图会多次检查其他对象的类型,而虚拟函数调用只会跟随vtable指针一次,以调用正确的函数。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp