[英]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.