2

我遇到了在 C++ 中分配运行时指针的问题。我有一个 base有 2 个成员线程和线程的类。

class base {

    struct base_struct {
        int a;
    };
    base_struct thread;
    std::vector<base_struct> threads;

    void fn () {}

};

derived1派生自base并具有相同的两个成员 (threadthreads) 但类型不同。

class derived1 : public base {
    struct derived_struct11 : public base_struct {
        int b;
    };
    derived_struct11 thread;
    std::vector<derived_struct11> threads;

    void fn () {
        printf();
    }

};

derived2也派生自base并具有相同的两个成员 (threadthreads),但类型不同。

class derived2 : public base {
    struct derived_struct22 : public base_struct {
        int c;
    };
    derived_struct22 thread;
    std::vector<derived_struct22> threads;

    void fn () {
        printf();
    }

};

只有在运行时我才能知道是否derived1derived2应该使用。所以我通过以下方式做到了:

base base_obj;
derived1 derived1_obj;
derived2 derived2_obj;

base *ptr ;

在运行时函数中:

{
    if (condition == yes)
        ptr = &derived1_obj;

    else
        ptr = &derived2_obj;
}

问题是我可以用this指针直接访问这些函数。但是线程的值(例如:threads.size()始终显示为base 类的值。

我想知道一些更好的方法来实现这一点。

4

2 回答 2

2

直接的问题是数据成员不能是虚拟的,因此您不能threads在派生类中覆盖。一种解决方案可能是在基类中只有一个threads,并将所有结构实例存储在其中。

但是,您会遇到切片问题:您将对象按值存储在std::vector<base_struct>. 这意味着无论何时你将一个对象放入其中,它都会被复制到向量中,使用base_struct. 这意味着原始对象的派生部分将被切掉,您只会得到一个base_struct元素。

要启用多态性,您应该只base_struct在向量中存储指向的指针:

std::vector<base_struct*> threads;

另一种方法是为 提供一个虚拟 getter threads,然后您可以在派生类中覆盖它以返回所需的集合。但是,在类层次结构中拥有多个具有相同名称的数据成员不是 IMO 的好主意。它可能会使人们感到困惑并导致细微的错误。所以我更喜欢第一个解决方案,除非有非常紧迫的理由在每个类中保留一个单独的集合。

于 2012-05-15T10:36:33.543 回答
0

一种解决方法是

base_struct* thread;
std::vector<base_struct*> threads; // <- hmmmmmmm

然后在您的派生类中,适当地设置基成员(而不是在派生类中定义两个新成员 - 我认为这不是您想要的)

于 2012-05-15T10:39:18.267 回答