将Derived * const转换为Base * const

时间:2010-10-16 20:44:05

标签: c++ const static-cast

编辑 - 将问题放入上下文中。

假设:

struct Base
{
    ...
};
struct Derived : public Base
{
    ...
};
class Alice
{
    Alice(Base *const _a);
    ...
};
class Bob : public Alice
{
    Bob(Derived *const _a);
    ...
};

当我尝试实施

Bob::Bob(Derived *const _d) : Alice(static_cast<Base*const>(_d)) { }

它不起作用。 a const_cast对我来说没有意义,因为我不想改变常量,而且我没有改变我指向的东西,那么为什么g ++会告诉我

invalid static_cast from type ‘Derived* const’ to type ‘Base* const’

?如果我遗漏演员,那就说

no matching function for call to ‘Alice::Alice(Derived* const)’

如果有人能对此有所了解,我们将不胜感激。

7 个答案:

答案 0 :(得分:5)

问题是Derived是一个不完整的类型,即前向声明。我担心我一直在给每个人一个艰难的时刻:( 当Kiril Kirow提议使用动态强制转换时,答案突然出现,g ++在这个问题上吐出了更有用的错误:

error: cannot dynamic_cast ‘_d’ (of type ‘struct Derived* const’) to type ‘struct Base* const’ (source is a pointer to incomplete type)

不幸的是,我已经向前宣布了Derived,但是我没有意识到它是相关的,并且它隐藏了几个标题,这会让我在这里张贴太多代码。对不起大家,但我希望这至少可以帮助别人。

答案 1 :(得分:1)

你根本不需要任何演员表。你有const指针,而不是const对象的指针。将派生对象的地址分配给没有强制转换的指针到基础是合法的。

答案 2 :(得分:1)

我有一个理论。如果在推导期间您意外忘记指定派生是公开的,该怎么办?在这种情况下,默认情况下它将是私有的,并且上述转换将无法访问。

你确定你写过

class Derived : ***public*** Base {...}


或许你忘了公开?只是一个理论......

答案 3 :(得分:1)

这完全适用于g ++ 4.4.3,甚至没有警告:

#include <iostream>

struct Base
{
    Base()
    {
    }
};

struct Derived : public Base
{
    Derived() {}
};

class Alice
{
public:
    Alice( Base *const _a )
    {
        std::cout << "Alice::Alice" << std::endl;
    }
};

class Bob : public Alice
{
public:
    Bob(Derived *const _a) 
        : Alice( static_cast< Base * const >( _a ) )
    {
        std::cout << "Bob::Bob" << std::endl;
    }
};

int main()
{
    Derived* pDer = new Derived();
    Bob b( pDer );
    return 0;
}

答案 4 :(得分:0)

您有不相关的类型AliceBase。更改Alice构造函数以获取Base*

顺便说一句,我怀疑您的const展示位置错误。

干杯&amp;第h。,

答案 5 :(得分:0)

此处唯一的问题是Alice::AliceAlice中是私有的。 Bob无法访问Alice::Alice

演员阵容无任何问题。实际上,您不需要static_cast。它应该被隐式转换。

您目前拥有的static_cast有效,但目标类型中的冗余const限定符除外。那const根本没有意义,但这不是错误。

为什么你的编译器发出这些奇怪的错误信息对我来说并不清楚。我怀疑你发布的代码是假的。

答案 6 :(得分:0)

虽然我不确定(上下文太少)但我认为你可能意味着 Base const * Derived const *

Base const * 是指向常量Base对象的指针。 Base * const 是一个指向可修改Base对象的常量指针。