为什么派生类必须将其方法声明为虚拟动态绑定才能工作,即使基类的方法被声明为虚拟?
答案 0 :(得分:5)
它没有。如果方法在基类中声明为virtual,则在派生类中重写该方法也会使重写函数成为虚拟函数,即使未使用virtual
关键字也是如此。
答案 1 :(得分:3)
没有。
class Base
{
virtual void foo() {}
};
class Derived : public Base
{
void foo() {}
}
此代码中的 foo()
在Derived
类中仍然是虚拟的,即使它未被声明为此类。
答案 2 :(得分:2)
class A
{
public:
virtual ~A(){}
virtual void f1()
{
std::cout<<"A::f1()\n";
}
virtual void f2()
{
std::cout<<"A::f2()\n";
}
};
class B : public A
{
public:
void f1()
{
std::cout<<"B::f1()\n";
}
void f2()
{
std::cout<<"B::f2()\n";
}
};
int main()
{
B b;
A* p = &b;
p->f1();
return 0;
}
答案 3 :(得分:2)
引用C ++标准(10.3.2):
如果在类
vf
和类Base
中声明虚拟成员函数Derived
,直接或间接地从Base
派生,则成员函数{{1声明了与vf
相同的名称和相同的参数列表,然后Base::vf
也是虚拟的(无论是否如此声明)并且它覆盖 {{1 }}
你可以总结一下:“一旦虚拟,永远虚拟”。但是,您仍然可以将Derived::vf
修饰符添加到重写成员函数中,以便向用户明确该类是多态的。
答案 4 :(得分:0)
一个人不需要。 但我更喜欢在派生类函数中使用virtual,因为它会在读取代码时使与这些函数关联的动态绑定更加清晰。