假设我有以下代码
class base
{
public:
virtual void MyVirtual() { std::cout << "This is base MyVirtual \n";}
void NonVirtual() { std::cout << "This is base NonVirtual \n";}
};
class derA : public base
{
public:
void MyVirtual() { std::cout << "This is derA MyVirtual \n";}
void NonVirtual() { std::cout << "This is derA NonVirtual \n";}
};
class derB : public derA
{
public:
void MyVirtual() { std::cout << "This is derB MyVirtual \n";}
void NonVirtual() { std::cout << "This is derB NonVirtual \n";}
};
int main()
{
derA *da = new derB;
da->MyVirtual(); // "This is derB MyVirtual \n"
da->NonVirtual();
std::cin.get();
return 0;
}
现在我的问题是为什么MyVirtual Method在类derA
中没有标记为虚拟时表现为虚拟?
答案 0 :(得分:3)
在C ++中,即使没有virtual
关键字,继承的虚函数仍然在派生类中保持虚拟。为每个继承的函数编写virtual
被认为是一种好习惯。
<强>更新强>
正如C ++ 11中的评论所指出的那样,在声明者之后立即包含关键字override
被认为是一种好习惯。这会捕获一类常见的错误,并在代码中明确表达意图。
答案 1 :(得分:3)
根据标准§10.3第2点
如果在类Base和a中声明了虚拟成员函数vf class派生,直接或间接来自Base,一个成员 函数vf,同名,参数类型列表, 与Base :: vf相关的cv-qualification和refqualifier(或不存在) 声明,然后Derived :: vf也是虚拟的(无论是否是这样 声明)并覆盖Base :: vf。
直接从标准中得到答案。因此,如果您在派生类中使用了关键字virtual
,则无关紧要。