#include <iostream>
#include <string>
using namespace std;
class Person
{
protected:
string name;
int age;
public:
Person(string n,int a): name(n),age(a) {};
~Person() {};
void print()
{
cout << "name: " << name << " ,age: " << age << endl;
}
};
class Student: public Person
{
private:
float score;
public:
Student(string n,int a,float s) : Person(n,a),score(s) {};
~Student() {};
void print()
{
cout << "name: " << name << " ,age: " << age << " ,score: " << score << endl;
}
};
void show(Person *per1)
{
per1->print();
}
int main()
{
Student stu("tanjianwen",20,98);
stu.print();
Person *per;
per = &stu;
per->print();
return 0;
}
Person的对象指针指向继承类的对象时,没有用virtual,仍然调用Person的函数,输出如下:
![virtual虚函数的作用 - JIM - 叶沁寒 virtual虚函数的作用 - JIM - 叶沁寒](http://img1.ph.126.net/0YzH51WE2VqIqBYvP81Y1Q==/1112389107978261247.png)
这是因为在没有声明虚函数的时候,在编译的时候就就进行了绑定。而是使用了virtual声明,就会采用迟绑定,到运行的时候再确认使用哪个函数。
#include <iostream>
#include <string>
using namespace std;
class Person
{
protected:
string name;
int age;
public:
Person(string n,int a): name(n),age(a) {};
~Person() {};
virtual void print()
{
cout << "name: " << name << " ,age: " << age << endl;
}
};
class Student: public Person
{
private:
float score;
public:
Student(string n,int a,float s) : Person(n,a),score(s) {};
~Student() {};
void print()
{
cout << "name: " << name << " ,age: " << age << " ,score: " << score << endl;
}
};
void show(Person *per1)
{
per1->print();
}
int main()
{
Student stu("tanjianwen",20,98);
stu.print();
Person *per;
per = &stu;
per->print();
return 0;
}
![virtual虚函数的作用 - JIM - 叶沁寒 virtual虚函数的作用 - JIM - 叶沁寒](http://img2.ph.126.net/3YLvF7zl6QfchbFxM1P-Ww==/2806868467776411692.png)