26A P58
#include <iostream.h>
#include <iostream.h>class A
{
public:
void print() //声明虚函数print();
{
cout<<"调用基类A的成员函数print().\n";
}
};
class B:public A //定义派生类B;
{
public:
void print()//声明函数print();
{
cout<<"调用派生类B的成员函数print().\n";
}
};
void main()
{
A a; //生成类A的实例a;
B b; //生成类B的实例b;
A* p1=&a; //定义基类A的指针p1指向实例a;
A* p2=&b; //定义基类A的指针p2指向实例b;
p1->print(); //调用基类的成员函数print();
p2->print(); //调用派生类的成员函数print();
}
P26B
#include <iostream.h>
#include <iostream.h>class A
{
public:
virtual void print() //声明虚函数print(); //定义虚函数
{
cout<<"调用基类A的成员函数print().\n";
}
};
class B:public A //定义派生类B;
{
public:
void print()//声明函数print();
{
cout<<"调用派生类B的成员函数print().\n";
}
};
void main()
{
A a; //生成类A的实例a;
B b; //生成类B的实例b;
A* p1=&a; //定义基类A的指针p1指向实例a;
A* p2=&b; //定义基类A的指针p2指向实例b;
p1->print(); //调用基类的成员函数print();
p2->print(); //调用派生类的成员函数print();
}
从程序的运行结果可以看出,虽然程序1的基类指针P2指向派生类,但是编译器调用的还是基类
的成员函数print().程序2在使用虚函数后,基类指针P2能够正确地调用派生类的成员函数print().
在程序2中,派生类B的成员函数print()可以没有关键词virtual 修饰,但是它也是虚函数。在c++
中,只要把基类的成员函数设定为虚函数,那么其派生类相应的函数也自动成为虚函数。