我知道当你想声明一个多态函数时,你必须声明基类函数为虚函数。继承类中的C++虚函数
class Base
{
public:
virtual void f();
};
我的问题是,你必须申报的继承类的功能虚拟化,即使它的预期,儿童的行为就好像它是“密封”?
class Child : public Base
{
public:
void f();
};
我知道当你想声明一个多态函数时,你必须声明基类函数为虚函数。继承类中的C++虚函数
class Base
{
public:
virtual void f();
};
我的问题是,你必须申报的继承类的功能虚拟化,即使它的预期,儿童的行为就好像它是“密封”?
class Child : public Base
{
public:
void f();
};
不,您不需要重新声明虚函数。
在碱类A virtual
功能将自动声明所有重写用作虚拟:
struct A
{
void foo(); //not virtual
};
struct B : A
{
virtual void foo(); //virtual
}
struct C : B
{
void foo(); //virtual
}
请记住重新编辑您的示例,以便C继承B。 – 2012-04-20 20:41:17
@Kevin感谢您的支持。还有,B从A. – 2012-04-20 20:42:26
声明f()的如在儿童虚拟有助于某些一个读儿童的定义。它作为文档很有用。
一旦基类覆盖标记为virtual
所有其他覆盖隐含如此。虽然您不需要将该功能标记为virtual
,但我倾向于将其用于文档目的。
截至最后一部分:即使预计孩子的行为就像是“密封”一样?,如果你想密封类,你可以真正做到这一点在C++ 11(这是不是完全可实现在C++ 03统称)通过创建一个密封类,像这样:
template <typename T>
class seal {
seal() {}
friend T;
};
然后从它继承您的密封类(CRTP):
class Child : public Base, virtual seal<Child> {
// ...
};
的诀窍是因为使用虚拟继承的,层次结构中最派生类型必须调用虚基类的构造(INT这种情况下, seal<Child>
),但该构造函数是p在模板类中内置,并且通过friend
声明仅可用于Child
。
在C++中,你将不得不要么创建一个seal
类型,为每个你想封,或者使用一个通用的办法,没有提供完美密封类(它可能被篡改)
'我知道如果孩子可以继承和f()反过来虚拟是必需的“ 这只是明显错误的。因为他的基类的功能是虚拟的,任何继承功能都是虚拟的。因此,不需要再次使用“虚拟”。永远不会。 – Jasper 2012-04-20 20:42:17