你是只调用子类自己的函数吗?
#include
using namespace std;
class B0
{
public:
virtual void display()
{
cout<<"B0"<
};
class B1:public B0
{
public:
void display()
{
cout<<"B1"<
void displayB1()
{
cout<<" My is B1"<
};
class D1:public B1
{
public:
void display()
{
cout<<"D1"<
};
void fun(B0 * ptr)
{
ptr->display();
}
void funB1(B1 *ptr)
{
ptr->displayB1();
}
int main()
{
B0 b0,*p;
B1 b1;
D1 d1;
p=&b0;
fun(p);
p=&b1;
fun(p);
funB1((B1 *)p); //调用子类函数
p=&d1;
fun(p);
return 0;
}
//动态联编与虚函数。
//动态绑定联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。虚函数是动态绑定的基础。
//是非静态的成员函数。
//在类的声明中,在函数原型之前写virtual。
//virtual 只用来说明类声明中的原型,不能用在函数实现时。
//具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
//本质:不是重载声明而是覆盖。
//调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。
#include
class B0 //基类B0声明
{
public:
virtual void display() //虚成员函数
{
cout<<"B0::display()"<
};
class B1: public B0 //公有派生
{
public:
void display()
{
cout<<"B1::display()"<
};
class D1: public B1 //公有派生
{
public:
void display()
{
cout<<"D1::display()"<
};
void fun(B0 *ptr) //普通函数,用一个动态指针指向一个暂时不确定的函数
{
ptr->display();
}
void main() //主函数
{
B0 *p; //声明基类指针,对所有继承类都适用
B0 b0; //声明基类对象
B1 b1; //声明派生类对象
D1 d1; //声明派生类对象
p=&b0;
fun(p); //调用基类B0函数成员
p=&b1;
fun(p); //调用派生类B1函数成员
p=&d1;
fun(p); //调用派生类D1函数成员
}