none
为什么这段代码是正确的? RRS feed

  • 问题

  • #include "stdafx.h"
    #include <string>
    #include <iostream>
    class Test final
    {
    public:
        void WriteLine(const std::wstring &str)
        {
            std::wcout << str;
        }
    };
    int main()
    {
        Test* t = nullptr;
        t->WriteLine(L"nullptr");
        return 0;
    }

    另外为何下面这样也能行?

    #include "stdafx.h"
    #include <iostream>
    class A
    {
    public:
        virtual void fun() { std::cout << "Fun"; }
    };
    class B : public A
    {
    public:
        virtual void fun() override { A::fun(); }
    };
    class C : public B
    {
    public:
        virtual void fun() override final { B::fun(); }
    };
    int main()
    {
        B* test = nullptr;
        ((C*)test)->fun();
        return 0;
    }

    2017年7月21日 7:43

全部回复

  • Hi Real_Name,

    感谢在MSDN论坛发帖。

    >>为什么这段代码是正确的?

    nullptr和NULL不同,它是指定类型为std :: nullptr_t的空指针常量。但是它是可以隐式转换的, 可以转换为任何原始指针类型。与任何指针类型或指针到成员类型相当。

    更多关于nullptr的用法和介绍,请参考以下文档。

    https://en.wikipedia.org/wiki/C%2B%2B11#Null_pointer_constant

    希望可以帮助到你。

    Best Regards,

    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    2017年7月24日 1:50
  • 虽然您定义的类的指针为NULL,但是仍然是可以访问该类的接口函数的,只要该接口函数没有直接或者间接访问该类的成员变量。
    如果是用NULL指针调用virtual虚函数也会有问题,下面那个没有出现错误使用因为使用了final关键字,final:可以用来指定派生类中的函数不会重写基类中的虚函数。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2017年7月24日 3:52
    版主
  • 虽然您定义的类的指针为NULL,但是仍然是可以访问该类的接口函数的,只要该接口函数没有直接或者间接访问该类的成员变量。
    如果是用NULL指针调用virtual虚函数也会有问题,下面那个没有出现错误使用因为使用了final关键字,final:可以用来指定派生类中的函数不会重写基类中的虚函数。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    请问这种情况下是怎么寻址的呢?

    尤其是后面那段代码,虽然用了final,但它调用的B::fun不是final的啊,为什么直接调用B::fun就不行,通过final函数调用就可以呢?

    2017年7月24日 3:58
  • Hi Real_Name,

    >>请问这种情况下是怎么寻址的呢?

    尤其是后面那段代码,虽然用了final,但它调用的B::fun不是final的啊,为什么直接调用B::fun就不行,通过final函数调用就可以呢?

    普通的成员函数,在类定义的时候就已经定义在内存中了。所以可以正常调用。而虚函数则需要通过对象中定义的虚函数表来访问。所以如果对象为空,则无法访问虚函数表,所以报错。

    在c++ 11的文档中说,类似final这种声明符属性,可以为编译器提供代码生成选项或优化提示,或者在编译代码中生成添加的数据,调试器,链接器和部署编译的代码,或提供添加的特定于系统的安全属性,或增强运行时的反射能力,或为其他编程语言和运行时系统的互操作性提供附加的绑定信息。

    如果你想了解更详细的内容,可以将该问题发布到Connect上。

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    • 已建议为答案 Angie Xu 2017年8月4日 3:16
    2017年8月2日 8:09