跨多个图层的模板化类未知类型
Templated class unknown type over multiple layers
我有以下类Foo和FooBase:
class FooBase
{
public:
virtual void A() = 0;
};
template <class T>
class Foo : public FooBase
{
public:
virtual void A() {}
private:
T mT;
};
FooBase
在这里拥有一个实例,而不需要知道类型,所以我可以像这样做 s.th:
FooBase *foo = new Foo<int>();
相当标准。现在的问题是:我想把同样的事情提升到一个新的水平。
所以我有课程:
template <class T>
class Bar : public Foo<T>
{
public:
virtual void B() {}
};
当然可以使用:
Bar<int> *bar = new Bar<int>();
除了我不知道模板类的类型。所以最初的想法是做以下几点:
class BarBase : public FooBase
{
public:
virtual void B() {}
};
template <class T>
class Bar : public BarBase, Foo<T>
{
};
所以我可以执行以下操作:
BarBase *bar = new Bar<int>();
出于显而易见的原因,这是行不通的 - 现在的问题是:如何让 s.th 这样的工作?
您可以使用虚拟继承解决此问题。此功能可确保在实例化子类时,虚拟继承的基类只有一个实例。对于您的示例,这如下所示:
class FooBase
{
public:
virtual void A() = 0;
};
template <class T>
class Foo : public virtual FooBase
// ^^
{
public:
virtual void A() {}
private:
T mT;
};
class BarBase : public virtual FooBase
// ^^
{
public:
virtual void B() {}
};
template <class T>
class Bar : public BarBase, Foo<T>
{
};
现在,您可以愉快地创建所需的实例:
BarBase *bar = new Bar<int>();
相关文章:
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 线程 std::调用未知类型,无法专门化函数错误
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- C++ 未知类型名称,即使类型是通过标头定义的
- 通过模板函数对未知类型调用方法
- 错误:使用 SWIG 的未知类型名称"类"
- C++:将未知类型的对象存储为成员变量的类
- 为什么未知类型名称"Complejo"?
- 在 Mac OS x 中制造期间出现错误未知类型名称"constexpr"
- 查找上下文RPC_NS_HANDLE未知类型名称
- 错误:未知类型名称"功能跟踪"
- C++中的自由定理:模板是否本质上对未知类型的对象无知和中立?
- 未知 使用用于C++代码的标头编译 C 代码时char16_t未知类型名称
- Linux中未知类型名称UINT64_T和UINT16_T UINT8_T
- 如何确定未知类型数组的索引是否为空
- 当我返回节点*时,C++中出现未知类型错误
- 无法编译任何C++程序;错误:未知类型名称'uint8_t'