小编Hor*_*ace的帖子

C++ 中的构造函数继承。派生类的默认构造函数未被调用

我有这个示例代码:

#include <iostream>

class A
{
public:
    A()
    {
        std::cout << "Default constructor of A" << '\n';
    }
    A(int i)
    {
        std::cout << "Inside the constructor of A with one int argument" << '\n';
    }
};

class B : A
{
    using A::A;
public:
    B()
    {
        std::cout << "Default constructor of B" << '\n';
    }
};


int main()
{
    B b(12);

    std::cout << "End of main";
}

Run Code Online (Sandbox Code Playgroud)

哪个输出:

Inside the constructor of A with one int argument
End of main …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor c++17

2
推荐指数
1
解决办法
109
查看次数

隐式编译器创建的默认构造函数是否可以有多个 null 主体?

隐式编译器创建的默认构造函数是否可以有多个 null 主体?根据IBM的网站,答案是:不。

我有这个项目有点难倒我:

这是声明一个名为 StackWalkerToConsole 的类的实例,没有定义默认构造函数的地方:

void func5()
{
  StackWalkerToConsole sw;
  ...
}
Run Code Online (Sandbox Code Playgroud)

这会以某种方式导致其父类的用户定义构造函数之一被调用:

StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)
{
  // The function has a body, I just removed it for clarity's sake.
  ...
}
Run Code Online (Sandbox Code Playgroud)

因此,我在这个构造函数上放置了一个断点,并使用调用堆栈查看了 StackWalkerToConsole 的默认构造函数。由于源码中没有定义,所以只能看它的反汇编:

StackWalker_VC2017.exe!StackWalkerToConsole::StackWalkerToConsole(void):
0000000140008210  mov         qword ptr [rsp+8],rcx  
0000000140008215  push        rdi  
0000000140008216  sub         rsp,40h  
000000014000821A  call        qword ptr [__imp_GetCurrentProcess (014012E060h)]  
0000000140008220  mov         qword ptr [rsp+30h],rax  
0000000140008225  call        qword ptr [__imp_GetCurrentProcessId (014012E068h)]  
000000014000822B  mov         rcx,qword ptr [rsp+30h]  
0000000140008230 …
Run Code Online (Sandbox Code Playgroud)

c++ x86 winapi constructor default-constructor

-1
推荐指数
1
解决办法
159
查看次数