C ++指针转换

时间:2014-04-02 08:46:58

标签: c++ pointers casting

我是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()。

你能帮忙吗? 提前谢谢!

3 个答案:

答案 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。你不需要任何转换,这就是虚函数的用途。