2012-04-20 101 views
1

我知道当你想声明一个多态函数时,你必须声明基类函数为虚函数。继承类中的C++虚函数

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

我的问题是,你必须申报的继承类的功能虚拟化,即使它的预期,儿童的行为就好像它是“密封”?

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

'我知道如果孩子可以继承和f()反过来虚拟是必需的“ 这只是明显错误的。因为他的基类的功能是虚拟的,任何继承功能都是虚拟的。因此,不需要再次使用“虚拟”。永远不会。 – Jasper 2012-04-20 20:42:17

回答

7

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

在碱类A virtual功能将自动声明所有重写用作虚拟:

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

请记住重新编辑您的示例,以便C继承B。 – 2012-04-20 20:41:17

+0

@Kevin感谢您的支持。还有,B从A. – 2012-04-20 20:42:26

0

声明f()的如在儿童虚拟有助于某些一个读儿童的定义。它作为文档很有用。

0

一旦基类覆盖标记为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类型,为每个你想封,或者使用一个通用的办法,没有提供完美密封类(它可能被篡改)