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

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

最佳答案

我能想到的两种方法来实现这一目标。

如果你已经有了多态类型,你的方法就很好(有一些小的改变)。 (如果 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;
}

但是,如果您的类型并不是真正密切相关怎么办?使用继承意味着类之间的关系非常严格(在这种情况下是一种)。 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);
}

关于c++ - 在 C++ 中运行时在用户定义的类之间进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8345265/

相关文章:

c# - 枚举和性能

c++ - 比较堆栈

C++ - 无法正确启动 (0xc0150002)

c - 将数组元素传递给c中的函数

c++ - C++ 中的转换何时改变值的位?

java - 如何从 int 转换为 byte,然后使用位移运算符

c++ - 以对象方式使用 QActions 改进现有代码

C++ - 一种确保调用全局清理函数的异常安全方法

c - 二维数组的三重指针的目的是什么?

c++ - 当数据可以在类对象超出范围之前被删除时,类允许访问其数据(通过 ptr/it)是不是糟糕的设计?