C++中关于父类函数在子类指针向上造型中overload函数被调用的研究

C++中关于父类函数在子类指针向上造型中overload函数被调用的研究


首先看一个现象

两个类

class A
{
	public:
		A():i(0){cout<<"A::A()"<<endl;}
        void f(){cout<<"A::f()"<<endl;}
		int i;
};
class B:public A{
	public:
	int j;
	B():{cout<<"B::B()"<<endl;}
	void f(){cout<<"B::f()"<<j<<endl;}
};

main()

int mian()
{
	A a;
	B b;
	A *p=&b;
	cout<<"p:"<<p<<endl;	
	p->f();
}

PS:这里两个类一个A为B的父类,main函数中做的是B类的地址传给A类的指针(向上造型:upcast),然后通过这个指针调用f()函数。

What I want to do ?

这个地方有个问题就是我通过这个指针调用的f()是A的还是B的?
因为这里的f()overload的。
这里就是想知道调用的那个?看运行结果

A::A()

这里可以看出调用的是A类的函数

那么this指针是不是指向对象b的呢?如果是那A类的f()是否可以操作b中的成员呢?

修改一下程序

#include<iostream>
using namespace std;
class A{
	public:
		A():i(0){}
		void f(){int *p =&i;cout<<"A::f()"<<*p<<" "<<"this:"<<this<<endl;}
        
		int i;
};

class B:public A{
	public:
	int j;
	B(){i=10;}
	public:	void f(){cout<<"B::f()"<<endl;}
};
int main()

{
	A a;
	B b;
	A *p=&b;
    cout<<"p:"<<p<<endl;
	p->f();
}

A::f()中创造一个指针,指向this指向的对象的成员变量“ i ”,为了区别a对象里面的“ i ”我们在B::B()里让i=10;
结果如下:

p:0x7fffc2f06ccc
A::f()10 this:0x7fffc2f06ccc

可见this指向了a并且A::f()是作用在a上了。

这也说明了this这个指针不能绝对的叫”自引用指针“,毕竟在B类里面没有A::f()(overlode)。

结论


两个类中在子类和父类中如果有overlode的现象通过upcasting的一个指针调用的overload函数,是调用其父类中那个函数,不是调用子类的函数,如果想调用子类的函数可以通过对象.f()的形式调用或者利用多态性,在每个overload的函数前面加virtual关键字然后用upcasting的指针来调用。并且这种二元的关系可以推广到多元的关系,读者可以自行证明,由于篇幅过长这里就不做赘述了。

感想

多态的意义就是让同一个动作不同的派生类可能细节上不同或者算法上不同,所以就让类本身去完成,而程序员只关心到底是谁而已。所以在多态中合理的利用upcastvirtual是很关键的。

posted @ 2020-04-04 23:11  NgAgo  阅读(144)  评论(0)    收藏  举报