关于虚函数,构造函数,非构造函数之间的交叉调用

首先,上代码(还是代码引发的血案)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class A
{
public:
    A(){
        this;
        print();
    }
    virtual void print(){
        this;
        cout<<"A"<<endl;
    }
    void think(){
        this;
        print();
    }
    virtual ~A(){}
 
private:
 
};
class  B:public A
{
public:
    B(int temp):A(),x(temp)
{
 
 
}
    virtual void print() override
    {
        this;
        cout<<"B"<<endl;
    }
    virtual ~ B(){}
 
private:
    int x;
 
};

  

B b(3);
b.think();

 

输出的结果:

A

B

为什么会出现这种情况呢?

 

因为子类并不继承父类的构造函数和析构函数!!!

相反会继承成员函数和虚函数,

在执行子类的构造函数时,会调用父类的构造函数,记住,是调用,也就是A::A(),这样一来,是进入了A类的作用域,this指针也就是A类对象的this指针

而执行成员函数时,因为继承的关系,所以一直处于子类的作用域,

 

记住,只要是子类继承父类,除了构造函数和析构函数之外,根本不存在父类的作用域,this指针全部都是子类对象的指针!!!!

posted @   LT.C#  阅读(273)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
阅读排行:
· 一个适用于 .NET 的开源整洁架构项目模板
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· .NET 依赖注入中的 Captive Dependency
点击右上角即可分享
微信分享提示