// bb.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream.h"
class person
{
public:
char *name;
int age;
person()
{
name="bhs";age=23;
}
person(char*str,int a)
{
name=str;age=a;
}
virtual show()
{
cout<<name<<endl<<age<<endl;
}
};
class student :public person
{
public:
int score;
int xh;
student()
{
score=90;
xh=2;
}
student(int a,int b,char *str,int c):person(str,c)
{
score=a;xh=b;
}
show()
{
cout<<name<<" "<<age<<" "<<score<<" "<<xh<<endl;
}
};
int main(int argc, char* argv[])
{
person bhs;
bhs.show();
student hyq(90,1,"bhs",22);
hyq.person::show();
hyq.show();
return 0;
}
编译环境VC6.0
结果与期望相同。去掉person中的virtual也无影响。有virtual则是覆盖,无则是隐藏,而运行结果反映不出覆盖与隐藏的不同,我想知道这二者在实现方面究竟有什么区别,而不是简单的判断是哪一个。高手救救我啊。
你用了子类的指针去访问,带virtual的情况下,的确是覆盖,但是由于是子类的指针,所以你访问的肯定是子类的函数。不带virtual情况下,自然也访问的是子类的函数。
但是当你用父类的指针访问的时候,你用了virtual,在覆盖的时候会生成一个【虚函数表】,这个表记录了所有的虚函数,当你用父类的指针访问某个函数的时候,是用索引去这个表中去查,而不是根据函数名,所以,就用同名函数实现了类的多态。。。
明白了吗
如果不明白可以发信给我
给你资料
代码如下··
#include <iostream>
using namespace std;
class A
{
public:
virtual void print()
{
cout << "A" << endl;
}
};
class B : public A
{
public:
virtual void print()
{
cout << "B" << endl;
}
};
int main()
{
B *pb;
A a;
pb = (B *)&a;
pb->print();
return 0;
}
你那个肯定是没区别的啊··
hyq.person::show()
是看不出来的吧,要用基类的指针去访问派生类...
这时候加不加virtual就有区别了啊··本回答被提问者采纳