none
为什么实现标记为deprecated的纯虚函数会有warning RRS feed

  • 问题

  • 代码如下:

    class IXXX
    {
    public:
    	__declspec(deprecated("xxx"))
    	virtual void Foo() = 0;
    };
     
    class XXX:public IXXX
    {
    public:
    	virtual void Foo(){}
    };
    

    这段代码在class XXX的结尾处有warning的。
    deprecated应该是只对使用报warning,否则的话就没有类能够实现Foo了,也就不能new 出实现了IXXX的对象了。
    当然我不要disable warning,因为我只是希望其它的地方不要使用Foo而已。
    这算VC的bug吗?

    2014年12月24日 2:58

全部回复

  • 你好:

          你的warning或error是C4996吗?这应该是正常的结果吧。这种情况有文档记录了:

    "If the compiler encounters the use of a deprecated identifier, a C4996 warning is thrown."

    http://msdn.microsoft.com/en-us/library/044swk7y.aspx

    还是说你的意思是不要error C4996,是需要warning C4996吗?这样的话:

    Configuration properties->C++->Gerneral->SDL checks 改为No。详细信息在:http://msdn.microsoft.com/en-us/library/jj161081.aspx, 如果我理解错了请告诉我。

    希望这些对你有帮助。

    Shu Hu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月24日 7:08
  • 我希望的是,对于x->Foo() 这样的代码有warning,而实现Foo的代码不要有warning。

    因为,对于x->Foo(),如果Foo是deperated的话,那一定有类似FooEx()的函数提供,来避免warning。
    而对于class XXX来说,不实现Foo是不可以的,而实现了就有warning。

    我说的bug的意思是,一旦对于接口的方法标记为deperated的话,那么一旦需要实现这个接口,就一定会有warning。但是,接口并没有废弃啊,只是其中的方法废弃了,不建议调用而已。

    文档上说的是"the use of",这样子算use吗?

    2014年12月24日 9:54
  • “use of a deprecated identifier”

    我的理解是只要你用了这个identifier也就是标识符就会触发异常。可能只能disabled 这个异常了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    • 已编辑 Shu 2017 2014年12月24日 10:01
    2014年12月24日 10:00
  • 看:

    __declspec(deprecated)
    void foo();
    
    void foo(int){}//重载没有warning
    void foo(){}//实现没有warning
    
    class X
    {
    public:
    	__declspec(deprecated("xxx"))
    	void foo(){}
    	__declspec(deprecated("xxx"))
    	virtual void bar(){}
    };
    
    class Y :public X
    {
    public:
    	void foo(){}//重写没有warning
    	void bar(){}//仅仅因为有个virtual,这里就有warning
    };

    2014年12月25日 9:42
  • 我懂你的意思了,我不确定这是不是一个bug,很可能是设计问题。对于一般的函数,调用它对于编译器就算是使用了;对于virtual函数,文档说的不太详细,编译器怎么样什么时候碰到这个标识符会丢出警告。当类有虚函数的时候编译器就会为他们两个分别插入一段数据(不太清楚这个数据的详细信息),并为他们分别创建一个表来索引相应的函数。也许在这个过程中编译器也算使用了这个标识符了呢?个人看法,如果你想得到关于这个问题正规的回复你可以提交到connect上。https://connect.microsoft.com/VisualStudio

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月26日 7:54
  • 我认为这是一个bug的原因是:如果deperated一个纯虚函数,那么导致的不仅仅是这个函数不能使用了。而是使得整个接口不能使用了,因为使用这个接口的情况之一就是实现它,实现它就不得不实现它的所有纯虚函数,然后就有warning了。你觉得不是bug,我想你说得这不是程序上的bug。我觉得那就是设计上的bug了。

    我上面的例子是为了解释"the use of",例子中写了4种看上去是对foo或bar的使用,只有1中报了warning。这4中情况都差不多,不是overload就是override。所以这里的use不是overload,override,更不是你说的用了identifier。可能更复杂的情况,可能就是bug。

    2015年1月8日 3:47