Bin*_*Boo 1 c++ virtual struct unions
我有嵌套结构,其中基类有一个纯虚函数。
(下面的例子有点伪,但描述了目的)
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; }
}
Run Code Online (Sandbox Code Playgroud)
我希望为所有不同类型创建一个表,所以我创建了这个:
struct BaseFootprint{
union{
Top1 top1;
Top2 top2;
}
std::vector<BaseFootprint> data;
Run Code Online (Sandbox Code Playgroud)
通过以下方式调用该函数不起作用:
for(int i=0;i<data.size;i++){
std::cwout <<data[i].toString()<< std::endl;;
}
Run Code Online (Sandbox Code Playgroud)
我努力了:
std::cwout << ((base)data[i]).toString() << std::endl;
Run Code Online (Sandbox Code Playgroud)
和:
std::cwout << (Top1)data[i].toString() << std::endl;
Run Code Online (Sandbox Code Playgroud)
但它总是说data[i]-> empty。
因此,令我失望的是,纯虚函数没有指向正确的顶层函数,这并不意外,这取决于如何通过联合查看结构数据。
由于我的最终产品将容纳数百种不同的顶级类型,我希望有一个动态的解决方案,而不是做出硬写的选择。动态解决方案将允许我在不更改基本代码的情况下添加新类型,这就是我所希望的。
如果有一种方法可以实现所描述的这一点,那就太棒了。
联盟不是正确的工具。
忽略其他编译器错误,您需要访问联合的特定成员(例如data[i].top1),并且无法访问除最后写入的成员之外的任何成员(这意味着您需要以某种方式记住向量中的哪个成员)。std::variant是类型安全的union,但您仍然需要大量样板代码才能访问正确的成员。
在 C++ 中使用多态性的正常方法是通过指针:
int main()
{
std::vector<std::unique_ptr<Base>> data;
data.push_back(std::make_unique<Top1>());
data.push_back(std::make_unique<Top2>());
for (auto& ptr : data)
{
std::wcout << ptr->toString();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |