虚函数和基类中的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();

你想一下这里存在基类a的指针吗?呵呵,这里并没有声明类a的对象,所以也根本没有类a的对象地址,自然这里的this只能是指向对象c了,只有对象c存在内存,拥有地址。你也可以自己编辑一段程序然后调试运行就知道了。

LZ你补充的例子有点问题,你typeid(this).name(),this指针虽然是指向inat的,但是在基类Base
中自然是转换类型成Base*了。你调试运行,查看this的地址就会发现和你例子中的&s是一样的。
参考技术A 我的理解是this指向的是c,只是c的数据成员还没初始化而已,因为你要先申请好大小适合的内在,然后才进行构造,只不过现在还在初始化基类成员,派生类没初始化而已。

派生类和基类的转换

指针引用分四种情况:

  1.直接用基类指针引用基类对象

  2.直接用派生指针引用派生对象

  3.由基类指针引用派生类对象,由于派生类也是基类对象(包含关系),所以这种引用是安全的。但是只能引用基类成员,若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)

  4.用派生类指针引用基类对象,这种方式会导致编译器报错。必须先把派生类指针强制转换成基类指针。

如果基类和派生类都定义了同名函数,通过对象指针调用成员函数时,到底调用哪里的函数由指针的原始类型决定,而不是由指针实际指向的对象类型决定。

 

 

以上是关于虚函数和基类中的this指针的问题!的主要内容,如果未能解决你的问题,请参考以下文章

一个c++虚函数与this指针的问题

C++多态总结

C++多态总结

基类中使用 this 指针的模板函数

为啥基类指针指向基类中的纯虚方法,而不是派生类中的覆盖方法?

如何将重写的虚函数的指针发送到基类?