如果我从A中得到B,那么从B得到B:
A
|
B
|
C
我很可能在A中有一个或多个虚函数。现在,我忘了将关键字virtual
放在B的函数声明中。但令我惊讶的是,它的工作方式就像在B中也设置了虚拟。这就是代码:
#include <iostream>
using std::cout;
using std::endl;
class A
{
public:
virtual void foo(){cout << "A\n";};
};
class B : public A
{
public:
void foo(){cout << "B\n";} // a "virtual doesn't change the behaviour...
};
class C : public B
{
public:
void foo(){cout << "C\n";}
};
int main()
{
C c;
c.foo();
A *pa = new C;
pa->foo();
B *pb = new C;
pb->foo();
return 0;
}
如果省略virtual
中的A
,则输出为
C
A
B
否则就是
C
C
C
即使没有virtual
中的B
!
那么:关键字是否以某种方式发送?或者我在这里理解错误了吗?
答案 0 :(得分:4)
如果一个方法在基类中是virtual
,那么它的子类中就是virtual
,而不必将它们声明为它。
答案 1 :(得分:4)
如果某个成员在类中声明为virtual
,则其派生类中的成员为virtual
。在派生类中标记方法virtual
不是必需的,但可能用于文档目的。在C ++ 11中,使用override
会使这变得多余。
答案 2 :(得分:3)
一个函数是虚拟的,因为它的最顶层基础将其声明为虚拟,派生成员函数是虚拟的,无论它是否隐式重新声明。
§10.3.2虚函数
如果虚拟成员函数vf在类Base和Derived类中声明,直接或间接从Base派生,则成员函数vf具有相同的名称,参数类型列表(8.3.5),cv-声明了Base :: vf的限定和refqualifier(或不存在相同的),然后Derived :: vf也是虚拟的(无论是否声明)。
答案 3 :(得分:1)
如果派生类中的方法签名与基类中的签名相同,则关键字virtual将自动继承。