继承类中的C++虚函数

继承类中的C++虚函数,c++,C++,我知道,当你想要声明一个多态函数时,你必须声明基类函数virtual class Base { public: virtual void f(); }; 我的问题是,您是否需要将继承类函数声明为virtual,即使子函数的行为应该与密封的一样 class Child : public Base { public: void f(); }; 不,您不需要重新声明虚函数 class Base { public: virtual void f(); }; 基类中的虚拟函数

我知道,当你想要声明一个多态函数时,你必须声明基类函数virtual

class Base
{
public:
    virtual void f();
};
我的问题是,您是否需要将继承类函数声明为virtual,即使子函数的行为应该与密封的一样

class Child : public Base
{
public:
    void f();
};

不,您不需要重新声明虚函数

class Base
{
public:
    virtual void f();
};
基类中的虚拟函数将自动将所有重写函数声明为虚拟函数:

struct A
{
   void foo();          //not virtual
};
struct B : A
{
   virtual void foo();  //virtual
}
struct C : B
{
   void foo();          //virtual
}

不,您不需要重新声明虚函数

class Base
{
public:
    virtual void f();
};
基类中的虚拟函数将自动将所有重写函数声明为虚拟函数:

struct A
{
   void foo();          //not virtual
};
struct B : A
{
   virtual void foo();  //virtual
}
struct C : B
{
   void foo();          //virtual
}

在Child中将f声明为virtual有助于理解Child的定义。它作为文档很有用。

在Child中声明f为virtual有助于理解Child的定义。它作为文档很有用。

一旦基类重写标记为虚拟,所有其他重写都隐式地标记为虚拟。虽然您不需要将函数标记为虚拟函数,但出于文档目的,我倾向于这样做

从最后一部分开始:即使期望子对象的行为与被密封的对象类似,如果您想密封该类,实际上可以在C++11中进行密封。一般来说,在C++03中,创建一个密封类并不能完全实现这一点,如下所示:

template <typename T>
class seal {
   seal() {}
   friend T;
};
然后从CRTP继承密封类:

class Child : public Base, virtual seal<Child> {
// ...
};
诀窍在于,由于使用了虚拟继承,层次结构中最派生的类型必须在本例中调用虚拟基构造函数int seal,但该构造函数在模板类中是私有的,并且仅通过友元声明对Child可用


<>在C++中,你必须为你要密封的每一类创建一个密封类型,或者使用一个没有提供完美封印的泛型方法,它可以被篡改

< p>一旦基类重写被标记为虚拟,所有其他重写都隐式地被标记。虽然您不需要将函数标记为虚拟函数,但出于文档目的,我倾向于这样做

从最后一部分开始:即使期望子对象的行为与被密封的对象类似,如果您想密封该类,实际上可以在C++11中进行密封。一般来说,在C++03中,创建一个密封类并不能完全实现这一点,如下所示:

template <typename T>
class seal {
   seal() {}
   friend T;
};
然后从CRTP继承密封类:

class Child : public Base, virtual seal<Child> {
// ...
};
诀窍在于,由于使用了虚拟继承,层次结构中最派生的类型必须在本例中调用虚拟基构造函数int seal,但该构造函数在模板类中是私有的,并且仅通过友元声明对Child可用


<>在C++中,你必须为你要密封的每一个类创建一个密封类型,或者使用一种没有提供完美封条的通用方法,它可能会被篡改

记住重新编辑您的示例,以便C从B继承。记住重新编辑您的示例,以便C从B继承。我知道是否可以从继承Child,并且反过来需要重写f,这完全是错误的。因为基类的函数是虚函数,所以任何继承函数都隐含虚函数。因此,无需再次使用虚拟机。从来没有。我知道若子级可以从继承而f反过来被重写,那个么虚拟是必需的,这完全是错误的。因为基类的函数是虚函数,所以任何继承函数都隐含虚函数。因此,无需再次使用虚拟机。从来没有。