c++语言中class中的virtual函数的隐藏和屏蔽

来源:互联网 发布:数控g92车螺纹怎么编程 编辑:程序博客网 时间:2024/05/08 10:11

经过自己的实验,结合网上的资料,在此发表自己的理解,希望能指出我的错误,感激不尽;(VS2010通过)

#include<iostream>
#include<string>
using namespace std;
class assiment
{

public:
int price;


  virtual void show(){

 cout<<"price: "<<price<<endl; }

assiment(int nu):price(nu){}
};
class Boss:public assiment
{
string name;
public:
virtual void show(){ 

        cout<<"price: "<<price<<endl;
cout<<"name: "<<name<<endl;
}
Boss(int num,string n):assiment(num),name(n){}
};


int main()
{
assiment *ptr;
Boss *p;
assiment ass(2000);
Boss shao(5000,"shao");
//调用基类指针指向Boss子类                    
ptr=&shao;                                                       
ptr->show();                                                    
//调用基类指针指向基类
ptr=&ass;
ptr->show();
//调用子类指针指向子类
p=&shao;
p->show();
//调用子类指针指向基类
//p=&ass;//显示错误,证明赋值兼容是不可逆的
//p->show();


system("pause");
return 0;
}

我定义两个简单的类,把assiment作为基类,而Boss类public继承assiment类,然后调用基类assiment类指针分别调用;


virtual函数和非virtual函数的区别到底在哪里呢?

 大家可以参照结果:

  非vitual show()函数的结果:      virtual show()函数的结果     
price: 5000                                         price: 5000                 
price: 2000                                         name: shao
price: 5000                                         price: 2000
name: shao                                        price: 5000
                                                             name: shao


非virtual show()函数的结果只是:


对于调用show()函数的时候把子类对象shao的从基类assiment继承来的成员price调用基类的函数,可见Boss的show()函数被屏蔽了,使用子类Boss对象的继承的成员的值执行基类的成员函数,这就是屏蔽;


而virtual show()函数的结果就是:

对于不同的对象调用相对应的成员函数,意思就是能够通过使用一个基类的指针操作子类所对应的virtual函数,这个指针可以是函数参数,可以是main()里指针调用,

virtual函数使得c++更加灵活;

切记:virtual继承和virtual函数是不同的,virtual继承是使得继承的成员只有一份,减少内存的占用,和virtual 函数是不同的两个概念。

楼主是个小新手。有什么错误还请指出;




0 0
原创粉丝点击