是否仅重写虚拟方法 我试图理解C++中的代码>虚拟和纯虚拟函数。我知道在派生类中,虚拟方法被派生类中给出的实现覆盖
下面是我用来测试的代码:是否仅重写虚拟方法 我试图理解C++中的代码>虚拟和纯虚拟函数。我知道在派生类中,虚拟方法被派生类中给出的实现覆盖,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,下面是我用来测试的代码: #include <iostream> using namespace std; class Base { protected: int a; public : virtual void modify () { a=200; } void print () { cout<<a<<"\n"; } }; class Derived
#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;
}
这意味着print()
与modify()
一起被覆盖
我的问题:
那么我们为什么需要虚拟方法呢…?用您的代码示例来考虑这种情况:
Base* b = new Derived();
b->modify();
b->print();
即使
b
指向派生的实例,调用虚拟方法b->modify
也会正确调用Derived::modify
。但是调用b->print
(未声明为虚拟)将打印200\n
,而不使用前面的\t
字符,正如您在Derived::print
中所做的那样。“这意味着print()也将与modify()一起被覆盖。”不,这不是这个意思。在第二种情况下,派生的
实例被用来调用打印
函数,事情就是这样。@JamesAdkison实际上,是的,它确实意味着它被重写了。调用的方法是实际对象类型的重写方法。虚拟的用途是,所有虚拟版本(因为“它实际上是同一个对象”)都将调用重写的对象,无论它被强制转换为哪种对象类型。它们为您提供了额外的语言能力,可以选择在强制转换为不同类型时要覆盖的类型。这就是多态性的真正威力。@PuddleDerived::print
函数是非虚拟函数,它隐藏了Base::print
函数,它不会覆盖它。@JamesAdkison它实际上覆盖了方法。它是否多态是一个独立的概念。但是,当然,基于非多态重写方法的技术术语,您是正确的,它被称为shadowed。但在全球智能感知的理解中,它仍然只是另一种说法,被覆盖,但不是多态的。多态性-以多种形式出现的能力
Base* b = new Derived();
b->modify();
b->print();