从Const引用接口到派生类的转换

Upcast from Const Reference Interface to Derived Class

本文关键字:转换 派生 Const 引用 接口      更新时间:2023-10-16

编辑:事实证明,我所说的实际上是向下转换,而不是向上转换。所以忽略我说向上投射的地方。

从const引用接口到派生类的上转换有效吗?它会引起问题吗?我会遇到我不知道的问题吗(除了向错误的对象升级之外,我不知道任何其他问题)。

struct IEventArgs
{
};
// Used in Win32 application
struct WinEventArgs : public IEventArgs
{
    HWND hwnd;
    LPARAM lParam;
    WPARAM wParam;
};
// Used in POSIX application
struct PosixEventArgs : public IEventArgs
{
    // ..
};
void some_event(const IEventArgs& args)
{
    // I know/expect a WinEventArgs so I will upcast it
    const WinEventArgs& wArgs = (const WinEventArgs&)args;
    char buf[255];
    sprintf(buf, "Cast ok: %d, %dn", wArgs.lParam,  wArgs.wParam);
    printf(buf);
}
int main()
{
    WinEventArgs args; // todo: initialise
    some_event(args);
    return 0;
}

也许我可以使用不同的设计/方法来获得相同的结果?我应该只使用一个空指针吗(尽管这意味着我不能使它常量,这很重要,因为对象不应该改变)。

这不是向上转换,而是向下转换一个IEventArgs)。

在任何合法的情况下,您都不会修改const-ness。您已经有一个const引用,并将其向下转换为特定的派生类。为什么它会引起问题?