关于C++:只有重写的虚拟方法

Are only virtual methods overridden

本问题已经有最佳答案,请猛点这里访问。

我试图理解C++中的EDOCX1 0和EDOCX1 1个函数。我知道在派生类中,虚方法被派生类中给定的实现重写。

下面是我用来测试这个的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>

using namespace std;


class Base
{
    protected:
    int a;
    public :
    virtual void modify ()
    {
        a=200;
    }
    void print ()
    {
        cout<<a<<"
"
;
    }
};
class Derived : public Base
{
    int b;
    public :
    void modify()
    {
        a=100;
        b=10;
    }
    void print ()
    {
        cout<<a<<"\t"<<b<<"
"
;
    }
};
int main ()
{
    Base b;
    b.modify ();
    b.print ();

    Derived d;
    d.modify ();
    d.print ();

return 0;
}

输出:

1
2
200
100   10

这意味着print ()也会与modify ()一起被覆盖。

我的问题:

那我们为什么需要虚拟方法呢?


在代码示例中考虑这种情况:

1
2
3
Base* b = new Derived();
b->modify();
b->print();

尽管b指向派生的实例,但虚拟方法b->modify的调用将正确地调用Derived::modify。但是,调用b->print而不是声明为虚拟的,将打印200
,而没有前面的\t字符,就像在Derived::print中一样。