【发布时间】:2023-01-11 02:47:21
【问题描述】:
我有嵌套结构,其中基础有一个纯虚函数。
(以下示例有点伪,但描述了目的)
struct Base {
int id=0;
virtual std::wstring toString() = 0;
}
struct Top1 : public Base {
id=1;
int val = 5;
std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}
struct Top2 : public Base {
id=2;
std::string val = "Hello!";
std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}
我希望为所有不同的类型创建一个表,所以我创建了这个:
struct BaseFootprint{
union{
Top1 top1;
Top2 top2;
}
std::vector<BaseFootprint> data;
以下列方式调用函数不起作用:
for(int i=0;i<data.size;i++){
std::cwout <<data[i].toString()<< std::endl;;
}
我努力了:
std::cwout << ((base)data[i]).toString() << std::endl;
和:
std::cwout << (Top1)data[i].toString() << std::endl;
但它总是说data[i]-> empty。
因此,令我失望的是,纯虚函数没有指向正确的顶级函数,这取决于通过联合查看结构数据的方式。
由于我的最终产品将容纳 100 种不同的顶级类型,我希望有一个动态的解决方案,而不是进行硬写的选择。动态解决方案将允许我在不更改基本代码的情况下添加新类型,这正是我所希望的。
如果有一种方法可以按照描述实现这一点,那就太棒了。
【问题讨论】:
-
你为什么把 Top1 和 Top2 放在一个联合中?
-
由于您使用的是层次结构,为什么要使用联合进行聚合,即为什么不使用
std::vector<Base*>?同样,由于您使用的是联合,为什么 hierarchy ,尤其是当没有指向 base 的指针时,要利用虚拟调度 -
fyi Anonymous unions 比 named
unions 有更多的限制