转换为一个类并从兄弟类调用函数?

时间:2009-10-05 06:53:15

标签: c++ casting

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

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 个答案:

答案 0 :(得分:7)

嘿,不要那样做。这就是虚拟方法的用途。

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;
}

答案 1 :(得分:3)

只需使用虚拟功能。这就是他们的目标。您的基类应该看起来像

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

其中= 0位是可选的。如果存在,则虚函数称为纯虚函数,并强制Base的每个子类实现该函数。

现在,如果您通过functionA指针调用Base,您将获得适合指针指向的子类的方法。

答案 2 :(得分:1)

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

  

投放到一个班级并打电话   兄弟班的功能?

     

这是我想要的,但我必须这样做   说它看起来很狡猾。是吗   定义的行为?如果没有,是否有   合法的动态盟友解决了这个问题?

简而言之:

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

但是,就像vava说的那样,不要这样做。

答案 3 :(得分:1)

  

是否有合法的动态方式   解决这个问题?

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

相关问题