给几段代码:
#include"iostream"
using namespace std;
class A{
public:
virtual void show(){cout<<"showA"<<endl;}
void printA(){cout<<"printA"<<endl;}
};
class B:public A{
public:
void show(){cout<<"showB"<<endl;}
void printB(){cout<<"printB"<<endl;}
};
void fun(A *p){p->printA(),p->show();}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
#include"iostream"
using namespace std;
class A{
public:
void show(){cout<<"showA"<<endl;}
void printA(){cout<<"printA"<<endl;}
};
class B:public A{
public:
void show(){cout<<"showB"<<endl;}
void printB(){cout<<"printB"<<endl;}
};
void fun(A *p){p->printA(),p->show();}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
我再给出一两段不同的代码:(错误代码)
#include <iostream>
using namespace std;
class A
{public:
void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); //p->printB();
}
int main()
{ A a; B b; f(&a);f(&b); //都是A类
return 0;
}
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); p->printB();
}
int main()
{ A a; B b; f(&a);
f(&b);
return 0;
}
报错13 41 F:\未命名1.cpp [Error] 'class A' has no member named 'printB'
意思就是A里没有 printB这个函数;
注释掉:
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); //p->printB();
}
int main()
{ A a; B b; f(&a);
f(&b);
return 0;
}
多态,基类指针的眼睛就只能看那么大的地方
三种:基类指针,虚函数,子类重写父类的虚函数
注意:(1)如果没有指针,父类对象调用就是父类中的成员函数,子类对象调用的就是子类中的成员函数,这个不能多态
(2)基类指针就算得到了子类对象的地址,那么,基类指针除了可以调用继承过来的公共成员函数及被子类重写的虚函数外,子类中的其他成员函数基类指针不能调用。
例如:
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); // p->printB();
}
int main()
{ A a; B b;
a.show();a.printA(); //a.printB();
b.show();b.printA(); b.printB();
return 0;
}
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); // p->printB();
}
int main()
{ A *p,a; B b;
p=&a;
p->show();p->printA(); //a.printB();
p=&b;
p->show();p->printA(); //p->printB();
return 0;
}
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); // p->printB();
}
int main()
{ A a,&p=a; B b;
p=a;
p.show();p.printA(); //a.printB();
p=b; //赋值
p.show();p.printA(); //p->printB();
return 0;
}
#include <iostream>
using namespace std;
class A
{public:
virtual void show(){cout<<"showA"<<endl; }
void printA(){cout<<"printA"<<endl; }
} ;
class B:public A
{public:
void show(){cout<<"showB"<<endl; }
void printB(){cout<<"printB"<<endl; }
} ;
void f(A *p){p->show();p->printA(); // p->printB();
}
int main()
{ B b; A &p=b; //初始化
p.show();p.printA(); //p->printB();
return 0;
}