使用g ++,如何取消虚拟类成员函数

对于声明为虚函数的函数,我似乎无法获取不推荐使用的警告来打印出来。 我正在使用“g ++(GCC)4.1.1 20061011(Red Hat 4.1.1-30)”。 我的研究表明,在gcc 4.x中可能会有一些问题,关于废弃纯虚函数(即类bueller {virtual int cameron()= 0;};),但不是…我想你会打电话给他们定期虚拟function 就这样我们在同一页面上…

foo.h中

class Foo { void Foo_A() __attribute__((deprecated)); //non-virtual virtual void Foo_B() __attribute__((deprecated)); //virtual virtual void Foo_C() __attribute__((deprecated)) = 0; //pure virtual }; 

说我编译这个,一个foo.cpp文件和一些main.cpp文件使用g ++。

1)任何使用Foo_A()的确实会显示警告。

2)任何使用Foo_B()的都不会显示警告。

3)任何inheritanceFoo的实现Foo_C,然后使用它不会显示警告。

第一:有效,没问题。

数字3:似乎是一个已知的bug /function..无论..

#2似乎没有探索,但是。 也许它被排在#3,虽然我没有发现任何提及它。

任何人都知道,如果我想在这里错过任何关于我想弃用的常规虚拟类成员函数?

顺便说一句:-Wno-deprecate在我的makefiles中没有打开。

鉴于这个计划:

 struct Foo { virtual void Foo_B() __attribute__((deprecated)); //virtual }; struct DerivedFoo : public Foo { }; int main() { DerivedFoo d; d.Foo_B(); Foo &f = d; f.Foo_B(); } void Foo::Foo_B() {} 

在CentOS 5.2(gcc版本4.1.2 20080704(Red Hat 4.1.2-44))上,我得到了与你描述的相同的输出:

 g++ deprecate.cc -o deprecate deprecate.cc: In function 'int main()': deprecate.cc:14: warning: 'Foo_B' is deprecated (declared at deprecate.cc:3) 

但是,在Ubuntu 10.04.1(gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)),我得到你所期望的输出:

 g++ deprecate.cc -o deprecate deprecate.cc: In function 'int main()': deprecate.cc:14: warning: 'virtual void Foo::Foo_B()' is deprecated (declared at deprecate.cc:3) deprecate.cc:16: warning: 'virtual void Foo::Foo_B()' is deprecated (declared at deprecate.cc:3) 

所以,我猜这是一个编译器错误得到修复。

你是否通过Foo指针/引用或派生类来调用Foo_B()/ Foo_C()? 如果您使用派生类,那么您必须标记其中已弃用的方法,或者获得您描述的行为。

Google在Debian名单上展示了一个关于这个主题的旧式讨论 。 但是这个话题没有什么新近出现。 尝试询问发行版(本例中为RedHat)列表。