#include<iostream>#include<cstdio>#include<cstdlib>#include<queue>#include<stack>#include<algorithm>#include<string>#include<map>#include<set>#include<vector>usingnamespace std;classAnimal{public:Animal(string name):name(name){}virtualvoidrun(){
cout <<"I don't kown how to run"<< endl;}private:
string name;};classCat:publicAnimal{public:Cat(string name):Animal(name){}voidrun() override final{
cout <<"I can run with four legs"<< endl;}};classPeople:publicAnimal{public:People(string name):Animal(name){}voidrun() override final{
cout <<"I can run with two legs"<< endl;}};classBat:publicAnimal{public:Bat(string name):Animal(name){}voidrun() override final{
cout <<"I can fly"<< endl;}};intmain(){#defineMAX_N10srand(time(0));
Animal **zoo =new Animal*[MAX_N];for(int i =0; i < MAX_N; i++){switch(rand()%3){case0: zoo[i]=newCat("cat");break;case1: zoo[i]=newPeople("people");break;case2: zoo[i]=newBat("bat");break;}}for(int i =0; i < MAX_N; i++) zoo[i]->run();return0;}
运行结果
I can run with four legs
I can run with four legs
I can fly
I can fly
I can fly
I can run with four legs
I can run with four legs
I can run with two legs
I can fly
I can run with two legs
2. 思考虚函数表
#include <iostream>#include <cstdio>#include <cstdlib>#include <queue>#include <stack>#include <algorithm>#include <string>#include <map>#include <set>#include <vector>
using namespace std;
class A {
public :
virtual void say(){
cout <<"Class A say"<< endl;}
virtual void run(){
cout <<"Class A run"<< endl;}};
class B : public A {
public :
void say() override final{
cout <<"Class B say"<< endl;}};
class C : public A {
public :
void run() override final{
cout <<"Class C run"<< endl;}};#define TEST(a) test(a, #a)
void test(A &a, string class_name){
cout <<"Object "<< class_name << endl;
a.say();
a.run();
cout <<"==========="<< endl << endl;return;}
int main(){
A a;
B b;
C c;
TEST(a);
TEST(b);
TEST(c);
//注意思考此处
((void **)(&b))[0]=((void **)(&a))[0];
TEST(b);return0;}
运行结果
Object a
Class A say
Class A run
===========
Object b
Class B say
Class A run
===========
Object c
Class A say
Class C run
===========
Object b
Class A say
Class A run
===========