基类的指针指向派生类的对象

说明:只要基类的成员函数是虚函数,派生类的同名函数(参数相同,返回值类型相同),函数体不同,不管有没有显式声明virtual都是虚函数。

派生类中virtual关键字可有可无,但是也是虚函数。


#include "stdafx.h" 
#include "iostream" 
using namespace std; 
 
class A 

    int x; 
public: 
    A(int i) {x=i;} 
    void show() 
    { 
        cout<<"A class show():x="<<x<<endl; 
    } 
    virtual void display() 
    { 
        cout<<"A class virtual display():x="<<x<<endl; 
    } 
}; 
 
class B:public A 

    int y; 
public: 
    B(int i,int j):A(i) { y=j;} 
    void show() 
    { 
        cout<<"B class show(): y="<<y<<endl; 
    } 
    void display()//前面有无virtual都可以 
    { 
        cout<<"B class virtual display():y="<<y<<endl; 
    } 
 
}; 
int main(int argc, _TCHAR* argv[]) 

    A a(5),*pa; 
    B b(10,20); 
    pa=&b; 
    pa->show(); 
    pa->display(); 
    system("pause"); 
    return 0; 

结论:

基类的指针指向派生类的对象,当调用同名的成员函数时:

1)如果在基类中成员函数为虚函数,那么基类指针调用的就是派生类的同名函数。virtual void display();

     可以这么理解:因为该函数是虚的,所以会找真正实现的那个函数,所以调用派生类B中的 B class virtual display.

2)如果基类中成员函数为非虚函数,则调用的是基类的成员函数。void show();

     因为基类是非虚的,已经完全实现了,所以没有必要再调用派生类的了,就调用基类的A class show()

猜你喜欢

转载自blog.csdn.net/qq873044564/article/details/80443535
今日推荐