gpt4 book ai didi

c++ - 多态设计,模板作为抽象类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:27 33 4
gpt4 key购买 nike

当你有一个类型取决于某些约束的成员时,你如何设计多态性。

假设我有这个:

template<typename T>
class Base
{
public:
Base() = default;
virtual ~Base() = default;
T member;
};

class DerivedA : public Base<int>
{
public:
DerivedA() {member = 5;}
};

class DerivedB : public Base<float>
{
public:
DerivedB() = default;
};

我希望能够根据不同的参数创建一个新的派生对象,即:

Base *b;
if (something)
b = new DerivedA();
else
b = new DerivedB();

显然我不能这样做,因为我需要为 b 的声明提供模板参数.

这是糟糕的设计吗?你如何处理这个问题?

我可以写一个小包装器:

class Wrapper() {};

template<typename T>
class Base : public Wrapper
{
// ...
};

Wrapper a, b;
a = new DerivedA;
b = new DerivedB;

但那样我就无法直接访问 memberBase 中声明的其他方法或 Derived .我需要投:reinterpret_cast<DerivedA*>(a)->member ,使多态性无用。

谢谢

最佳答案

包装设计应该正是您正在寻找的。问题是 c++ 是静态类型的,所以你不能在不指定其类型的情况下声明成员。避免这种情况的常见方法是设计一个支持您想要的所有功能的基类,并在派生类中实现特定行为,就像您所做的那样。

问题可能是您的类不支持您需要的所有功能。尽量避免直接使用 member 并将其用法包装到虚方法中。在派生类中重新实现这些方法。

如果这仍然不是一个选项,请考虑提取成员的方法。也许是经过适当转换的虚拟 getter 和 setter。

作为最后的手段,考虑 boost::variant、boost::any。但实际上它们是使用类似于包装器的技术实现的。所以你得到了包装器的包装器。

关于c++ - 多态设计,模板作为抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971833/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com