Dynamic_Cast in C++

Dynamic_Cast in C++

本文关键字:C++ in Cast Dynamic      更新时间:2023-10-16

对于正确的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^2addTo()函数,其中N是您希望能够互换添加的类的数量。但它与您需要编写的if(Foo& foo = dynamic_cast<Foo&>(other)) {...}子句的计数相同。

双重调度可能更快,因为else if()梯形图会多次检查其他对象的类型,而虚拟函数调用只会跟随vtable指针一次,以调用正确的函数。