派生类的成员函数是否从基类继承虚拟性?

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)

Oli*_*rth 6

从C++标准(第10.3节):

如果虚拟成员函数vf是在类中声明Base和一个类Derived,直接或间接地从衍生Base,[...]Derived::vf也是虚拟(它是否被这样声明).

是的


iam*_*ind 6

如果是基类方法,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关键字,可以克服这些问题.