虚函数和基类中的this指针的问题!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数和基类中的this指针的问题!相关的知识,希望对你有一定的参考价值。
比如 基类 定义虚函数 派生类也定义虚函数 在全局定义基类指针 *a
通过调用a->虚函数来实现不同派生类的功能函数 我知道将派生类对象地址赋给a指针就能达到目的,
现在我糊涂的是
在一个线程当中 定义个派生类对象c 并且执行该派生类的构造函数
先执行基类a的构造函数
比如基类构造函数
class a()
a() a=this //此时a是指向其他派生类b的 我不明白就在这里 这个this指针是基类a的指针还是前面派生类c的指针
说的可能有点糊涂
简单说 在执行派生类构造函数的同时基类构造函数也运行 同时基类构造函数中的this指针来传入a中 这样是否能实现多态,以此来运行派生类中的虚函数呢?
测试发现this始终指向基类
#include <stdio.h>
#include <iostream>
using namespace std;
class Base
public:
Base *x;
Base()
cout<<"Create:"<<typeid(this).name()<<endl;
x=this;
~Base()
cout<<"Delete:"<<typeid(this).name()<<endl;
void test()
cout<<"Base test "<<typeid(this).name()<<endl;
;
class inat:public Base
public:
inat()
cout<<"Create:"<<typeid(this).name()<<endl;
~inat()
cout<<"Delete:"<<typeid(this).name()<<endl;
void test()
cout<<"inat test "<<typeid(this).name()<<endl;
void sss()
x->test();
;
void main()
inat s;
s.test();
s.sss();
LZ你补充的例子有点问题,你typeid(this).name(),this指针虽然是指向inat的,但是在基类Base
中自然是转换类型成Base*了。你调试运行,查看this的地址就会发现和你例子中的&s是一样的。 参考技术A 我的理解是this指向的是c,只是c的数据成员还没初始化而已,因为你要先申请好大小适合的内在,然后才进行构造,只不过现在还在初始化基类成员,派生类没初始化而已。
派生类和基类的转换
指针引用分四种情况:
1.直接用基类指针引用基类对象
2.直接用派生指针引用派生对象
3.由基类指针引用派生类对象,由于派生类也是基类对象(包含关系),所以这种引用是安全的。但是只能引用基类成员,若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)
4.用派生类指针引用基类对象,这种方式会导致编译器报错。必须先把派生类指针强制转换成基类指针。
如果基类和派生类都定义了同名函数,通过对象指针调用成员函数时,到底调用哪里的函数由指针的原始类型决定,而不是由指针实际指向的对象类型决定。
,
以上是关于虚函数和基类中的this指针的问题!的主要内容,如果未能解决你的问题,请参考以下文章