继承类中的C++虚函数
我知道,当你想要声明一个多态函数时,你必须声明基类函数virtual继承类中的C++虚函数,c++,C++,我知道,当你想要声明一个多态函数时,你必须声明基类函数virtual class Base { public: virtual void f(); }; 我的问题是,您是否需要将继承类函数声明为virtual,即使子函数的行为应该与密封的一样 class Child : public Base { public: void f(); }; 不,您不需要重新声明虚函数 class Base { public: virtual void f(); }; 基类中的虚拟函数
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反过来被重写,那个么虚拟是必需的,这完全是错误的。因为基类的函数是虚函数,所以任何继承函数都隐含虚函数。因此,无需再次使用虚拟机。从来没有。