C++; 我在C++中遇到了运行时指针分配问题。我有一个 base类,包含两个成员线程和线程 class base { struct base_struct { int a; }; base_struct thread; std::vector<base_struct> threads; void fn () {} };

C++; 我在C++中遇到了运行时指针分配问题。我有一个 base类,包含两个成员线程和线程 class base { struct base_struct { int a; }; base_struct thread; std::vector<base_struct> threads; void fn () {} };,c++,polymorphism,base,runtime.exec,derived,C++,Polymorphism,Base,Runtime.exec,Derived,derived2也是从base派生的,并且具有相同的两个成员(thread 和线程),但类型不同 class derived1 : public base { struct derived_struct11 : public base_struct { int b; }; derived_struct11 thread; std::vector<derived_struct11> threads; void fn () {

derived2
也是从
base
派生的,并且具有相同的两个成员(
thread
线程
),但类型不同

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

    void fn () {
        printf();
    }

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

    void fn () {
        printf();
    }

};
在运行时函数中:

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

    else
        ptr = &derived2_obj;
}
问题是我可以用
这个
指针直接访问函数。但是 线程的值(例如:
threads.size()
始终显示为
base
班级


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

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

但是,您会遇到切片问题:您是通过
std::vector
中的值来存储对象。这意味着,无论何时将对象放入其中,都会使用(生成的)将其复制到向量中复制
base\u struct
的构造函数。这意味着原始对象的派生部分将被切掉,并且您将只获得
base\u struct
元素

要启用多态性,应在向量中仅存储指向
base\u struct
的指针:

std::vector<base_struct*> threads;
std::向量线程;

另一种方法是为
线程
提供一个虚拟getter,然后您可以在派生类中重写该getter以返回所需的集合。但是,在类层次结构中使用几个同名的数据成员不是一个好主意。这会使人感到困惑并导致微妙的错误。因此我更喜欢第一个解决方案unl因此,在每个类中保留一个单独的集合是一个非常紧迫的原因。

一种解决方法是

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

std::vector threads;//这甚至不应该编译,因为
base::base_struct
private
。这是一个糟糕的示例。发布正确的代码非常重要。这会让帮助更容易。感谢各位。我确实有特定的理由在两个类中保留相同名称的成员。我将尝试其他解决方案。
base_struct* thread;
std::vector<base_struct*> threads; // <- hmmmmmmm