【发布时间】:2016-01-24 10:12:08
【问题描述】:
我试图理解 C++ 中的 virtual 和 pure-virtual 函数。我开始知道在派生类中,虚拟方法被派生类中给出的实现覆盖。
这是我用来测试的代码:
#include <iostream>
using namespace std;
class Base
{
protected:
int a;
public :
virtual void modify ()
{
a=200;
}
void print ()
{
cout<<a<<"\n";
}
};
class Derived : public Base
{
int b;
public :
void modify()
{
a=100;
b=10;
}
void print ()
{
cout<<a<<"\t"<<b<<"\n";
}
};
int main ()
{
Base b;
b.modify ();
b.print ();
Derived d;
d.modify ();
d.print ();
return 0;
}
输出:
200
100 10
这意味着print () 也与modify () 一起被覆盖。
我的问题:
那我们为什么还需要虚方法...?
【问题讨论】:
-
“这意味着 print () 也与 modify () 一起被覆盖。”不,不是这个意思。在第二种情况下,
Derived实例被用来调用print函数,这就是发生的事情。 -
@JamesAdkison 实际上,是的,它确实意味着它被覆盖了。调用的方法是实际对象类型的重写方法。 virtual 的用途是,所有虚拟版本(因为“它实际上是同一个对象”)都会调用被覆盖的对象,无论它被转换为哪种对象类型。它们为您提供了额外的语言能力,可以选择在转换为不同类型时要保持覆盖的语言。这就是多态的真正力量。
-
@Puddle
Derived::print函数是非虚拟的,它会影响Base::print函数,而不是override它。 -
@JamesAdkison 它确实覆盖了方法。是否是多态是一个单独的概念。但是当然,根据非多态覆盖方法的技术术语,您将其称为阴影是正确的。但在全球智能感知理解中,它仍然只是另一种说法,被覆盖,而不是多态。大声笑
-
多态性——以多种形式出现的能力
标签: c++ inheritance virtual-functions