是否需要指定覆盖功能虚拟?

Tim*_*Tim 4 c++

在Cplusplus中,在派生类中,如果我们定义一个成员函数来覆盖其父类中的成员函数,我们是否需要将派生类中的成员函数声明为虚拟?

例如,我们是否需要声明g为虚拟B输入才能覆盖A::g?以下哪一项对于上述目的是正确的?

class A{
public:
void f(){printf("A");}
virtual void g(){printf("A");}
}
class B : public A{
public:
void f(){printf("B");}
void g(){printf("B");}
}
Run Code Online (Sandbox Code Playgroud)

要么

class A{
public:
void f(){printf("A");}
virtual void g(){printf("A");}
}
class B : public A{
public:
void f(){printf("B");}
virtual void g(){printf("B");}
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jar*_*d42 9

一旦方法在类中是虚拟的,即使您没有添加virtual它们,它的子类也具有这些虚拟类.

添加override是避免细微错误的好习惯:

class A{
public:
    void f()         { printf("A"); }
    virtual void g() { printf("A"); }
};
class B : public A{
public:
   void f()          { printf("B"); }
   void g() override { printf("B"); }
};
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 6

不,你没有.该函数从层次结构中的第一个点开始是虚拟的,您可以在其中声明它.

您可以而且应该override在c ++ 11及更高版本中指定它.它明确指定您正在尝试覆盖基类中的虚函数.如果拼错函数名称,错误输入参数或执行其他任何可以被视为添加函数重载的内容,则会发出错误.在c ++ 11之前,以前的错误会默默编译.