2014-04-02 99 views
1

我是新的C++编程所以这个问题可能是基本的,但在这里它是: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 ::列表

//Class A - some code 
protected: 
    list<C*> myObjects; 

在类BI具有推向myObjects指针类型d的对象的函数(同样保持指针类C的对象, D继承C)完美的作品。

Class B : public A 
{ 
    // Some code 
    D* obj = new D(...); 
    myObjects.push_back(obj); 
    return obj; 
} 

最后,在课堂上BI有超过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*' 

我下如果“a”是指向D类对象的指针,那么如果我给它指向迭代器引用的指针的值(指向指向D类型对象的指针),我可以调用Print ()。

你能帮忙吗? 在此先感谢!

+0

@juanchopanza我试过,但由于打印没有在C类中定义,我得到C2039:'打印':不是C.的成员。 – Tal

+0

对不起,我错过了那部分。那么你需要尝试'dynamic_cast'。最好是用代码而不是散文表达相关信息。 – juanchopanza

+0

而不是仅仅试图解释你有什么,用小的代码外的代码片断,为什么不创建一个[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve),你可以给我们看一看?这会让你更容易理解你有什么和可能发生的事情。 –

回答

1

尝试

D *a=dynamic_cast<D *>(*it) 

列表的内容可能是d的对象,但这只是在运行时知道的,所以编译器不能在编译时知道,如果列表包含的d对象或C.其他派生类

根据记录,该代码编译的ideone

+0

我得到错误C2683:'dynamic_cast':C不是一个多态类型 – Tal

+0

@Tal你说C有虚拟方法...尝试了一个与g ++的虚拟示例,它的工作。 – jsantander

+0

我错了。 A是抽象的。 C不是。对于混淆抱歉 - 我编辑了原始问题。 – Tal

2

没有必要试图转换为D类型,如果你定义

virtual void Print() = 0; 

in class C

然后,你可以通过编写

C *a = *it; 
C->Print(); 

,或者甚至更好利用多态性,

(*it)->Print(); 

如果你不能做到这一点,那么你可以使用一个dynamic_cast,或简单地存储list<D*> myObjects;代替。

+0

显然:“D类实现了一个Print()函数,C没有。” – jsantander

+0

@jsantander:哎呀。忘了阅读规范。不会是最后一次;-) – Bathsheba

+0

但是,您的解决方案是完全有效的...如果允许更改C的API ... – jsantander

0

请确保Print被声明为纯虚在C,然后只需使用C指针,而不是D在打印循环。您不需要任何投射,这就是虚拟功能的用途。