经过自己的实验,结合网上的资料,在此发表自己的理解,希望能指出我的错误,感激不尽;(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 函数是不同的两个概念。
楼主是个小新手。有什么错误还请指出;