代码之家  ›  专栏  ›  技术社区  ›  drby

强制转换到一个类并从同级类调用函数?

  •  2
  • drby  · 技术社区  · 16 年前

    我得到了一个指向基类的指针(实际上是指向某个派生类的指针)。然后我想在那个派生类上调用一个函数,但我不知道它是哪个。

    class Base
    {
    
    };
    
    class DerivedOne : public Base
    {
        public:
            void functionA()
            {   int x = 0;  }
    };
    
    class DerivedTwo : public Base
    {
        public:
            void functionA()
            {   int x = 0;  }
    };
    
    int main()
    {   
        Base* derivedTwoPtr = new DerivedTwo();
    
        reinterpret_cast<DerivedOne*>(derivedTwoPtr)->functionA(); 
    
        return 0;
    }
    

    这是我想要的,但我不得不说,它看起来相当狡猾。它定义了行为吗?如果没有,是否有合法的方法来动态解决这个问题?

    4 回复  |  直到 7 年前
        1
  •  7
  •   vava    16 年前

    嘿,别这样。这就是虚拟方法的用途。

    class Base
    {
    public:
        virtual void functionA()=0;
    
    };
    
    class DerivedOne : public Base
    {
        public:
            virtual void functionA()
            {       int x = 0;      }
    };
    
    class DerivedTwo : public Base
    {
        public:
            virtual void functionA()
            {       int x = 0;      }
    };
    
    int main()
    {   
        Base* derivedTwoPtr = new DerivedTwo();
    
        derivedTwoPtr->functionA(); 
    
        return 0;
    }
    
        2
  •  3
  •   Troubadour    7 年前

    只需使用虚拟功能。这就是他们的目的。你的基类应该是

    class Base
    {
        virtual void functionA() = 0;
    };
    

    何处 = 0 位是可选的。如果存在,则虚拟函数称为纯虚拟函数,并强制执行 Base 实现功能。

    现在如果你打电话 functionA 通过一 基地 指针您将得到适合于指针真正指向的任何子类的方法。

        3
  •  1
  •   1800 INFORMATION    16 年前

    你基本上回答了你自己的问题:

    铸造 去一个班打电话 来自兄弟类的函数?

    这是我想要的,但我必须 说它看起来有点诡异。它是 定义的行为?如果没有,有没有 法律途径 动态 盟友解决这个问题?

    简而言之:

    if (DerivedOne* one=dynamic_cast<DerivedOne*>(BasePtr))
      one->functionA();
    else if (DerivedTwo* two=dynamic_cast<DerivedTwo*>(BasePtr))
      two->functionA();
    

    但是的,就像瓦娃说的,不要这样做。

        4
  •  1
  •   aJ.    16 年前

    有没有合法的方法来动态 解决这个问题?

    dynamic_cast 可用于强制转换到特定的派生类并调用派生类方法。但在您的情况下,最好是在基类中提供一个虚拟方法,并为派生类中的虚拟方法提供不同的实现。