两种代码方式:

 

class person {
public:
    void f() { cout << "person.f()" << endl; }
};

class woman :public person {
public:
    void f() { cout << "woman.f() "<< endl; }
};

void f(person *p)
{
    p->f();
}
int main() {
    
    person A;
    woman B;

    f(&B);
    
    return 0;
}

 

 执行结果如下,这是upcasting的例子。

person.f()

 

第二个例子:加上virtual

class person {
public:
    virtual void f() { cout << "person.f()" << endl; }
};

class woman :public person {
public:
    virtual void f() { cout << "woman.f() "<< endl; }
};

void f(person *p)
{
    p->f();
}
int main() {
    
    person A;
    woman B;

    f(&B);
    
    return 0;
}

 

运行结果:woman.f()

 

这就是virtual的作用。

当使用指针或者引用的时候,不论指针或者引用的类型是父类还是子类,总是找到最精确的类型,去执行对应的成员函数。

posted on 2017-12-20 12:48  newbird2017  阅读(126)  评论(0编辑  收藏  举报