我在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()
}
因为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
};
^
中的函数。为什么它仍然是虚拟的?
答案 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)
虚拟永远虚拟。
由于foo
在A
中是虚拟的,因此从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