在C ++中在运行时在用户定义的类之间进行更改

时间:2011-12-01 17:00:32

标签: c++ pointers casting user-defined-types

我有两个类,一个扩展另一个。他们都有一个名为doSomething()的方法,可以执行不同的操作。我希望能够有一个指针,我可以从class A切换到class B并让其余代码运行相同,因为它们每个都有相同的方法名称。这是可能的,这是正确的方法吗?另外,我对C ++很陌生,所以它可能只是一个问题。

class A {
    void doSomething()
    {
        // does something
    }
};

class B: public A {
    void doSomething()
    {
        //does something else
    }
};


main()
{
    A *ptr = new A;
    B *bptr = new B;

    // a giant loop

    ptr->doSomething();


    if(condition) 
    {
        ptr = bptr;
    }
}

2 个答案:

答案 0 :(得分:5)

我可以想到两种方法来实现这一目标。

如果你已经有多态类型,你的方式很好(有一些小的改动)。 (如果B是一个A,逻辑上)

class A
{
public:
    virtual void f() { /* something */ };
};

class B : public A
{
public:
   virtual void f() { /* something else */ };
};

int main()
{
   A a;
   B b;
   A* c = 0;

   // based on your condition
   c = &a;
   c->f();
   c = &b;
   c->f();

   return 0;
}

但是,如果你的类型不是那么密切相关呢?使用继承意味着类之间的关系非常严格(在这种情况下是is-a)。 B真的是A吗?

这是为具有相同命名功能的类实现此目的的一种方法,但实际上并不是类似的类型。

template <class T>
void do_f(T& obj)
{
   obj.f();
}

class D
{
public:
   void f() { /* something */ }
};

class E
{
public:
   void f() { /* something else entirely */ }
};

int main()
{
   // note, D and E have no relation
   D d;
   E e;

   // based on your condition
   do_f(d);
   do_f(e);
}

答案 1 :(得分:2)

您要实现的目标称为多态性。在C ++中,您需要为A和B定义一个公共(可能是抽象的)基类C,使doSomething为virtual function,在A和B中都覆盖它,并生成类型为C *的指针。这是关于该主题的good introductory article