向下转换并同时从const转换为非const

时间:2012-05-14 13:11:33

标签: c++ inheritance casting

我在转换参数时遇到了一些问题:

我有这个结构:

class XMLCO 
{...};

class CO: public XMLCO 
{...};

我的问题在于构造函数中的这个类:

class ProcessUnit
{
public:
    ProcessUnit( const CO& co );
private:
    NetComm _ipComm;
};

对象_ipComm(类型为NetComm)需要使用XMLCO进行初始化,但是在这个构造函数中我只给了一个继承XMLCO的CO,所以我虽然可以在构造函数中做某种类似的向下转换:

ProcessUnit::ProcessUnit( const CO& co )
{
    CO temp = const_cast<CO>( co ); // to remove the const -- THIS LINE CAUSE THE PROBLEM (it gives me this error: the type in a const_cast must be a pointer or reference to an object type 
    CO* ptrTemp = &temp; // to make it a pointer
    XMLCO* xmlcc = dynamic_cast<IOXMLDescCreationContext*>( ptrTemp );

    _ipComm = new IONetworkComm( *xmlcc );
}

我想知道的是,是否有更简单的方法(不改变通用结构的任何内容)或者我做错了什么。

由于

2 个答案:

答案 0 :(得分:4)

  

对象_ipComm(类型为NetComm)需要使用XMLCO进行初始化,但是在这个构造函数中我只给了一个继承XMLCO的CO,所以我虽然可以做某种向下转换

在您的情况下,您无法向上,只能向上。幸运的是,这个演员是隐含的。因此,没有什么可以留给你做的。你可以指定:

CO temp = co;

但请注意,此复制对象。这真的是你想要的吗?此外,删除const可能不仅是不必要的,而且是错误的。即使您更正了代码中的语法,这仍然无效。要正确诊断,您需要发布其他定义。

答案 1 :(得分:0)

不要使用const_cast,因为这里没有必要 - 看起来你的问题与参数的常量无关,因为_ipComm可能是用初始化的副本 co

问题可能是IONetworkComm的构造函数接受了非const对象。如果是这种情况并且这不是一个错误,那么它会告诉你一些关于IONetworkComm的设计 - 即它需要从非const对象初始化。也许你应该在ProcessUnit类的构造函数中反映出来?也许它应该是:

ProcessUnit( CO& co );