这种问题首先得清楚调用的是哪一个版本的函数!!然后就可以知道该函数所在的作用域
代码一:
#include <iostream>
using namespace std;
class A
{
public:
void CallPrint()const;
private:
virtual void print()const;
};
void A::CallPrint()const
{
print();
}
void A::print()const
{
cout<<"call A print"<<endl;
}
class B:public A
{
private:
void print()const;
};
void B::print()const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}
结果是:call B print
因为print是虚函数,而目标对象的类型是B 或者说this指针指向的动态类型是B,所以调用的是B类的print,所以在CallPrint 内部使用了多态。其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了吧。
代码二:
#include <iostream>
using namespace std;
class A
{
public:
void CallPrint()const;
void print()const;
};
void A::CallPrint()const
{
print();
}
void A::print()const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print()const;
};
void B::print()const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}
结果是:call A print
可以知道调用的是A类的print,因为print是非虚函数,先在A的作用域中找,所以调用的是基类A的print函数,其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了
代码三:
#include <iostream>
using namespace std;
class A
{
public:
void CallPrint()const;
virtual void print(double val)const;
};
void A::CallPrint()const
{
print(3);
}
void A::print(double val)const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print(int val)const;
};
void B::print(int val)const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}
结果是:call A print
代码四:
#include <iostream>
using namespace std;
class A
{
public:
A():m(2){}
virtual void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}
class B:public A
{
public:
B():m(3){}
void PrintMem()const;
protected:
int m;
};
void B::PrintMem()const
{
cout<<m<<endl;
}
int main()
{
B obj;
obj.PrintMem();
return 0;
}
结果是:3
代码五:
#include <iostream>
using namespace std;
class A
{
public:
A():m(2){}
void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}
class B:public A
{
public:
B():m(3){}
void PrintMem()const;
protected:
int m;
};
void B::PrintMem()const
{
cout<<m<<endl;
}
int main()
{
B obj;
obj.PrintMem();
return 0;
}
结果是:3
代码六:
#include <iostream>
using namespace std;
class A
{
public:
A():m(2){}
void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}
class B:public A
{
public:
B():m(3){}
protected:
int m;
};
int main()
{
B obj;
obj.PrintMem();
return 0;
}
结果是:2
代码七:
#include <iostream>
using namespace std;
class A
{
public:
virtual void print(int value)const;
};
void A::print(int value)const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print(double value)const;
};
void B::print(double)const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.print(3);
A *p=&obj;
p->print(3);
return 0;
}
结果是:call B print
call A print
代码八:
#include <iostream>
using namespace std;
class A
{
public:
virtual void print()const;
};
void A::print()const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print();
};
void B::print()
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.print();
A *p=&obj;
p->print();
return 0;
}
结果是:call B print
call A print
通过这几个代码的实践,让我对继承机制的实现有更深入的理解了