我是C ++编程的新手,所以这个问题可能是基本的,但现在是:
我有四个班级 - A,B,C和D.他们的关系定义如下:
class B : public A;
class D : public C;
A是一个抽象类(所有方法都是纯虚拟的)。 D类实现了一个C语言没有的Print()函数。
//Class D - some code
void Print()
{
//some code
}
A类有一个STL :: list,它包含指向C类对象的指针。
//Class A - some code
protected:
list<C*> myObjects;
在B类中,我有一个函数,它推送到类型为D的对象的myObjects指针(同样,D继承了C),它完美地运行。
Class B : public A
{
// Some code
D* obj = new D(...);
myObjects.push_back(obj);
return obj;
}
最后,在B类中,我有一个函数迭代myObjects(继承自A类),如下所示:
for(list<C*>::iterator it = myObjects.begin(); it != myObjects.end(); it++)
{
//I wish to call the function D.Print() but I get an error!
D *a = *it;
a->Print();
}
错误状态:
error C2440: 'initializing': cannot convert from 'std::_List_iterator<_Mylist>' to 'D*'
我的印象是,如果&#34; a&#34;是指向D类对象的指针,如果我给它指向迭代器引用的指针的值(指向D类型对象的指针),我可以调用Print()。
你能帮忙吗? 提前谢谢!答案 0 :(得分:2)
如果您定义
,则无需尝试强制转换为D
类型
virtual void Print() = 0;
课程C
中的。
然后你可以通过编写
来利用多态性C *a = *it;
C->Print();
或者,甚至更好,
(*it)->Print();
如果你不能这样做,那么你可以使用dynamic_cast
,或者只是存储list<D*> myObjects;
。
答案 1 :(得分:1)
尝试
D *a=dynamic_cast<D *>(*it)
列表的内容可能是D对象,但这些对象仅在运行时已知,因此编译器在编译时无法知道列表是否包含来自C的D对象或其他派生类。 / p>
为了记录,此代码在ideone
上编译答案 2 :(得分:0)
确保在Print
中将C
声明为纯虚拟,然后在打印循环中使用C
指针而不是D
。你不需要任何转换,这就是虚函数的用途。