我遇到了 C++ 中运行时指针分配的问题。我有一个
具有 2 个成员线程和线程的 base
类。
class base {
struct base_struct {
int a;
};
base_struct thread;
std::vector<base_struct> threads;
void fn () {}
};
provided1
派生自 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();
}
};
衍生2
也是从base
派生的,并且具有相同的两个成员(thread
和线程
),但类型不同。
class derived2 : public base {
struct derived_struct22 : public base_struct {
int c;
};
derived_struct22 thread;
std::vector<derived_struct22> threads;
void fn () {
printf();
}
};
只有在运行时我才能知道是否应该使用衍生1
或衍生2
。所以我
通过以下方式做到了:
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
类。
我想知道一些更好的方法来实现这个。
最佳答案
直接的问题是数据成员不能是虚拟的,所以你不能覆盖 threads
在派生类中。一种解决方案可能是只有一个 threads
在基类中,并将所有结构实例存储在其中。
但是,您会遇到切片问题:您正在按 std::vector<base_struct>
中的值存储对象。 。这意味着每当您将一个对象放入其中时,它都会使用 base_struct
的(生成的)复制构造函数复制到 vector 中。 。这意味着原始对象的派生部分将被切掉,你只会得到一个 base_struct
元素。
要启用多态性,您应该仅存储指向 base_struct
的指针在你的 vector 中:
std::vector<base_struct*> threads;
另一种方法是为 threads
提供虚拟 getter ,然后您可以在派生类中重写它以返回所需的集合。然而,在类层次结构中拥有多个同名的数据成员在我看来并不是一个好主意。它可能会让人们感到困惑并导致微妙的错误。因此,我更喜欢第一个解决方案,除非有非常紧迫的理由在每个类中保留单独的集合。
关于c++ - C++ 中指针的运行时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598841/