繁体   English   中英

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

[英]Does derived class' member functions inherit virtualness from base class?

qualifier. 假设我们有以下两个类,A是具有虚拟析构函数的基类,B是派生类,其析构函数没有限定符。 before 我的问题是,如果我要从B派生更多的类,B的析构函数会自动继承虚拟,还是需要在之前明确地设置

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;};
};

从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) {}
};

实际上, B::foo()并没有用virtual机制覆盖A::foo() ; 相反,它隐藏了它。 因此无论你使B::foo()虚拟化,都没有优势。

在C ++ 0x中,您有override关键字,它克服了这些问题。

虚拟性一直在继承。 您只需要在顶层基类中指定它。

这对于析构函数和普通成员函数都是如此。

例:

class Base { virtual void foo() { std::cout << "Base\n"; } };
class Derived1 : public Base { void foo() { std::cout << "Derived1\n"; } };
class Dervied2 : public Derived1 { void foo() { std::cout << "Derived2\n"; } };

int main()
{
    Base* b = new Base;
    Base* d1 = new Derived1;
    Base* d2 = new Derived2;
    Derived1* d3 = new Derived2;

    b->foo(); // Base
    d1->foo(); // Derived1
    d2->foo(); // Derived2
    d3->foo(); // Derived2
}
or I need to explicitly put 'virtual' before '~B() {...}'

不,你不需要,虽然你可以把虚拟放在这里为读者提供更清晰的代码。 这不仅适用于析构函数,也适用于所有成员函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM