繁体   English   中英

C ++模板容器继承

[英]C++ Template Container Inheritance

在Java荒野中花了太多时间后,我对C ++还是有些陌生。

假设我有数据类A和B和一个容器类,我将其称为Container:

class A
{
public:
  virtual void foo()
  {
    cout << "I am an A" << endl;
  }
};

class B : public A
{
public:
  void foo()
  {
    cout << "I am a B" << endl;
  }
};

template <class T> class Container
{
public:
  T *_t;

  Container(T *t)
  {
    _t = t;
  }
};

相当于我想要的Java外观

B b = new B();
Container<? extends A> aContainer = new Container<B>(b);

应该如何在C ++中完成? 这甚至规范吗?

以下代码给出了编译错误:

B *b = new B();
Container<A> *aContainer = new aContainer<B>(b);

到目前为止,Google一直在寻找“?extends”的等效项方面无济于事。

==编辑==

解决方案是重写我的代码,这样就不需要“?extends”了,如下面的Isaac Drachman所述。

如果您使用的是C ++ 11(或可能是Boost),则可以使用std::is_base_of<A,B> (如果A是B的基类,则包含(value =)true)。

无论如何,您可以执行以下操作:

template<class T>
class container {
    void append(T* what);
}

如果尝试执行append(derived) ,请考虑container<base> ,这很好,因为指向派生的指针可以转换为base的指针。

但是,这使您可以获得所有内容的列表。

如果要控制它,就像Java中的“扩展”;

static_assert(!std::is_base_of<base,T>::value,"You must derive from base");

将其粘贴在某处,并得到一个不错的错误消息“您必须从基础派生”

对于模板,由于模板系统复杂且更高级(可以执行更多操作),因此无法指定“ T扩展B”,因此,如果使用相同的方法名称指定类型,则更改工作可能会变得很糟糕。如果您错过了一个方法名,但似乎并没有告诉您您错过了一个方法名,则会发生错误。

您对A,B和Container类的声明是有效的,并且可以用于此目的。 以下语法引起错误。

B *b = new B();
Container<A> *aContainer = new aContainer<B>(b);

首先,当对带有new的类使用构造函数时,需要使用类名(例如Java中的类名),而不是对象的名。 至于继承方面,您的容器被声明为Container<A> ,因此即使B从A继承,也不能构造为Container<B> 。对aContainer对象使用Container<A>类型和构造函数将使您能够包含一个A对象或B对象,这是我认为您要尝试执行的操作。 因此,您的代码应为以下内容:

B *b = new B();
Container<A> *aContainer = new Container<A>(b);

可以编译并为您工作。 随意解释这是否不适合您的工作。 希望能有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM