zha*_*nwu 3 c++ inheritance virtual-functions
假设我们有以下两个类,A是具有虚拟析构函数的基类,B是派生类,其析构函数没有"虚拟"限定符.我的问题是,如果我要从B派生更多的类,B的析构函数会自动继承虚拟,还是需要在'~B(){...}之前明确地设置'virtual '
class A
{
public:
A() { std::cout << "create A" << std::endl;};
virtual ~A() { std::cout << "destroy A" << std::endl;};
};
class B: A
{
public:
B() { std::cout << "create B" << std::endl;};
~B() { std::cout << "destroy B" << std::endl;};
};
Run Code Online (Sandbox Code Playgroud)
从C++标准(第10.3节):
如果虚拟成员函数
vf是在类中声明Base和一个类Derived,直接或间接地从衍生Base,[...] 则Derived::vf也是虚拟(它是否被这样声明).
是的
如果是基类方法,virtual则所有后续派生类方法都将成为virtual.然而,IMO是一个很好的编程实践,可以virtual超越该方法; 只是为了向读者表明功能的本质.
另请注意,在某些极端情况下您可能会得到意外结果:
struct A {
virtual void foo(int i, float f) {}
};
sturct B : A {
void foo(int i, int f) {}
};
Run Code Online (Sandbox Code Playgroud)
这里其实,B::foo()不覆盖A::foo()与virtual机制; 相反,它隐藏了它.所以无论你做B::foo()虚拟,都没有优势.
在C++ 0x中,您有override关键字,可以克服这些问题.