如何解决覆盖方法时,虚拟关键字是什么意思?
| 覆盖方法时,关键字virtual有什么作用?我没有使用它,一切正常。 在这方面,每个编译器的行为都一样吗? 我是否应该使用它?解决方法
没有它,您将无法覆盖成员函数。
您只能隐藏一个。
struct Base {
void foo() {}
};
struct Derived : Base {
void foo() {}
};
Derived::foo
不会覆盖Base::foo
;它只是将其隐藏,因为它具有相同的名称,例如:
Derived d;
d.foo();
调用Derived::foo
。
virtual
启用多态,以便您实际上覆盖函数:
struct Base {
virtual void foo() {}
};
struct Derived : Base {
virtual void foo() {} // * second `virtual` is optional,but clearest
};
Derived d;
Base& b = d;
b.foo();
这将调用Derived::foo
,因为它现在将覆盖Base::foo
-您的对象是多态的。
(由于切片问题,您还必须为此使用引用或指针。)
Derived::foo
不需要重复to5ѭ关键字,因为Base::foo
已经使用过它。这是标准所保证的,您可以依靠它。但是,有些人认为最好还是保持清晰。
, 基类中的“ 5”方法将在层次结构中级联,从而使每个具有相同签名的子类方法也变为“ 5”。
class Base{
public:
virtual void foo(){}
};
class Derived1 : public Base{
public:
virtual void foo(){} // fine,but \'virtual\' is no needed
};
class Derived2 : public Base{
public:
void foo(){} // also fine,implicitly \'virtual\'
};
如果仅出于文档目的,我建议编写ѭ5。
, 当一个函数是虚拟的时,无论您是否每次都明确指定它是虚拟的,它在整个层次结构中都是虚拟的。覆盖方法时,请使用virtual以便更明确-没有其他区别:)
class A
{
virtual void f()
{
/*...*/
};
};
class B:public A;
{
virtual void f() //same as just void f()
{
/*...*/
};
};
, 扩展Light Races的答案,也许这将有助于某些人了解它在做什么。
struct Base {
public:
void foo() {
printf_s(\"Base::foo\\n\");
}
};
struct Derived : Base {
void foo() {
printf_s(\"Derived::foo\\n\");
}
};
struct BaseVirtual {
public:
virtual void foo() {
printf_s(\"BaseVirtual::foo\\n\");
}
};
struct DerivedVirtual : BaseVirtual {
virtual void foo() {
printf_s(\"DerivedVirtual::foo\\n\");
}
};
Derived d;
d.foo(); // Outputs: Derived::foo
Base& b = d;
b.foo(); // Outputs: Base::foo
DerivedVirtual d2;
d2.foo(); // Outputs: DerivedVirtual::foo
BaseVirtual& b2 = d2;
b2.foo(); // Outputs: DerivedVirtual::foo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。