是否仅重写虚拟方法 我试图理解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实际上,是的,它确实意味着它被重写了。调用的方法是实际对象类型的重写方法。虚拟的用途是,所有虚拟版本(因为“它实际上是同一个对象”)都将调用重写的对象,无论它被强制转换为哪种对象类型。它们为您提供了额外的语言能力,可以选择在强制转换为不同类型时要覆盖的类型。这就是多态性的真正威力。@Puddle
Derived::print
函数是非虚拟函数,它隐藏了
Base::print
函数,它不会
覆盖它。@JamesAdkison它实际上覆盖了方法。它是否多态是一个独立的概念。但是,当然,基于非多态重写方法的技术术语,您是正确的,它被称为shadowed。但在全球智能感知的理解中,它仍然只是另一种说法,被覆盖,但不是多态的。多态性-以多种形式出现的能力
Base* b = new Derived();
b->modify();
b->print();