继承层次中 this,名字查找 导致的成员调用问题
2013-05-02 13:14
337 查看
这种问题首先得清楚调用的是哪一个版本的函数!!然后就可以知道该函数所在的作用域
代码一:
结果是:call B print
因为print是虚函数,而目标对象的类型是B 或者说this指针指向的动态类型是B,所以调用的是B类的print,所以在CallPrint 内部使用了多态。其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了吧。
代码二:
结果是:call A print
可以知道调用的是A类的print,因为print是非虚函数,先在A的作用域中找,所以调用的是基类A的print函数,其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了
代码三:
结果是:call A print
代码四:
结果是:3
代码五:
结果是:3
代码六:
结果是:2
代码七:
结果是:call B print
call A print
代码八:
结果是:call B print
call A print
通过这几个代码的实践,让我对继承机制的实现有更深入的理解了
代码一:
#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
通过这几个代码的实践,让我对继承机制的实现有更深入的理解了
相关文章推荐
- 成员函数调用delete this的问题
- 名字查找与继承(函数调用的确认)
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.
- C++之:函数调用的名字查找与继承
- 【js学习之路】事件绑定函数中,将this换成调用对象导致的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- 类成员函数中调用socket接口close()问题
- 对 PInvoke 函数的调用导致堆栈不对称问题
- 怎么解决操作无效,原因是它导致对 SetCurrentCellAddressCore 函数的可重入调用问题
- dojo中出现的一个比较诡异的问题:继承中成员变量出现公用的问题
- epoll在多进程下产生的“惊群”现象——如何避免——多进程因为文件描述符继承问题导致
- java面向对象-使用this语句解决构造器重载相互调用问题
- 在SQL SERVER中导致索引查找变成索引扫描的问题分析
- C++中继承,虚函数的调用问题
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- javascript基础之我见(2)----一句话搞定this,并浅析js,as相互调用的this问题
- jquery ajax回调函数中调用$(this)的问题
- Java成员变量调用方法赋值问题