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