在简化设计中,B类以多态方式继承A类。
模板化类Base<T>
具有T*
成员,用于进一步操作。 Derived<T>
以Base<T>
多态继承。
什么是允许这种对象创建的语法:
Base<A>* a = new Derived<B>();
为了进一步参考,我使用的代码看起来像这样(当然,转换不成功):
class A
{
public:
A()
{
cout<< " A ";
}
virtual void one()
{
cout<<" 1 ";
}
};
class B: public A
{
public:
B()
{
cout << " B ";
}
void one()
{
cout << " 2 ";
}
};
template <class T>
class Base
{
public:
T* thing;
Base()
{
cout<<"Base";
thing = new T;
}
template <class S>
Base(Base<S>* obj)
{
thing = obj->thing;
}
virtual void poly(){ thing->one();}
};
template <class T>
class Derived : public Base<T>
{
public:
Derived()
{
cout << "DERIVED ";
}
virtual void poly(){
};
int main(int argc, char** argv)
{
//Base<A>* a = (new Derived<B>());
return 0;
}
为了简洁代码,故意省略虚拟析构函数和适当的内存管理。
编辑:此构造的唯一目的是将BaseTemplated<BasePolymorphic>*
指针列在一起,而不是BaseTemplated<Derived1>
用于BaseTemplated<DerivedN>
对于基类的所有N个子类,多态类。
答案 0 :(得分:4)
首先,告诉我什么时候进入“简单化”部分。
将所有一半模板剥离,只关注你想要变形的部分。最终,您有不同的类Base<A>
和Base<B>
。 (后者通过推导Derived<B>
)。
这些都不会从各自的模板参数继承。因此,A
与B
的关系(等级或其他)是无关紧要的。 Base<A>
和Base<B>
是截然不同且不相关的,因此您尝试执行的操作无法正常工作。事实上,即使 分别从A
和B
继承,你最希望的是一个A*
指针,你不是' t在你的样本中使用。
如果另有说明,我很乐意删除它,因为我真的很好奇。
答案 1 :(得分:3)
一袋苹果Base<B>
不是一袋水果Base<A>
,因为你可以把桃子,樱桃和梨放在一袋水果里。
答案 2 :(得分:1)
这不适用于指针。 new Derived<B>
的结果无法分配给Base<A>*
,实际上它甚至无法分配给Derived<A>*
,因为所有这些类型都不相关。你真的需要模板封装器之间的这种关系吗?是否足以保证Base<B>
和Base<A>
的值的可兑换性(正如标准的智能指针那样)?您已经使用模板化转换构造函数...
//...
Base<B> tB(new B);
Base<A> tA = tB;
//...