为什么允许覆盖非虚函数?

时间:2015-10-13 03:43:45

标签: c++ function virtual

我在C ++中体验过继承。

struct A {
    virtual void foo(){ std::cout << "foo()" << std::endl; }
    void bar(){ std::cout << "bar()" << std::endl; }
};

struct B : A{
    void foo(){ std::cout << "derived foo()" << std::endl; }
    void bar(){ std::cout << "derived bar()" << std::endl; }
};

struct C : B {
    void foo(){ std::cout << "derived derived foo()" << std::endl; }
    void bar(){ std::cout << "derived derived bar()" << std::endl; }
};

int main()
{

    B* b = new C();
    b->foo();  //derived derived foo()
    b->bar();  //derived bar()
}

LIVE DEMO

因为foo中我认为struct B函数被调用的函数B被称为非虚拟函数。但foo来自C的是B。为什么?我改变了#34;虚拟状态&#34; In file included from editorMain.cpp:2:0: EditorList.h:40:2: error: multiple types in one declaration }; ^ In file included from EditorList.cpp:4:0: EditorList.h:40:2: error: multiple types in one declaration }; ^ EditorList.h:40:2: error: multiple types in one declaration }; ^ 中的函数。为什么它仍然是虚拟的?

3 个答案:

答案 0 :(得分:5)

foo()在基类A中声明为虚函数,因此所有派生类中的foo()也将是虚拟的。

从标准中,10.3 $ 2虚函数[class.virtual](由我粗体显示)

  

如果在类Base和a中声明了虚拟成员函数vf   class派生,直接或间接来自Base,一个成员   函数vf,同名,参数类型列表(8.3.5),   与Base :: vf一样的cv-qualification和ref-qualifier(或不存在)   声明,然后Derived :: vf也是虚拟的(是否是   声明)并覆盖Base :: vf。

答案 1 :(得分:2)

虚拟永远虚拟。

由于fooA中是虚拟的,因此从A派生的所有类中都是虚拟的 - 无论他们是否获得virtual关键字。

答案 2 :(得分:1)

上述答案有效,但我们可以使用override关键字,因为

The override special identifier means that the compiler will check the
base class(es) to see if there is a virtual function with this exact
signature. And if there is not, the compiler will indicate an error.

所以这样的事情是struct B

void bar() override