gpt4 book ai didi

c++ - 派生模板类不调用构造函数

转载 作者:行者123 更新时间:2023-12-04 14:04:49 26 4
gpt4 key购买 nike

我正在使用 C++ 实现事件模板,如下所示

模板.h

template<typename EventArg>
class Event {
public:
typedef void (*EventHandle)(const EventArg&);
vector<EventHandle> EventHandles;


protected:
virtual void Init() { throw EventNotInitialized();};
Event()
{
printf("Event() \n");
Init();
}
};

事件.h

struct E_EventArgs {
string data;
};
class E_Event : public Event<E_EventArgs>
{
public:
static E_Event * Get() {
static auto ins = new E_Event();
return ins;
}
protected:
void Init() override {
printf("E_Event() Init() \n");
}
E_Event() {
Init();
printf("E_Event() \n");
}
};

然后我调用 E_Event::Get() 来访问 E_Event。但这是日志:

Event()

我使用 arm-oe-linux-gnueabi-g++(gcc 版本 6.4.0 (GCC))

为什么E_Event的构造函数没有被调用?

最佳答案

您观察到的并不是从构造函数调用虚函数的结果。

In a constructor, the virtual call mechanism is disabled because overriding from derived classes hasn’t yet happened. Objects are constructed from the base up, “base before derived”.

这意味着当您从 E_Event 的构造函数调用 Init() 时,Init() 的最新“最新”覆盖版本是基类 Event

但是在您的情况下,E_Event 的构造函数中的 Init() 调用不会发生。

当你构造一个派生类时,也会构造一个基类的实例。考虑这个简单的例子。

#include <iostream>
class Base
{
public:
Base()
{
std::cout<<"Base constructor"<<std::endl;
}
};
class Derived: public Base
{
public:
Derived()
{
std::cout<<"Derived constructor";
}
};
int main()
{
Derived();
}

输出将是

Base constructor
Derived constructor

如您所见,Base 的构造函数也被调用了。所以 E_Event 的构造函数也调用了 Event(),它已经抛出异常,这就是为什么 E_Event 中的任何东西都不会被调用。

关于c++ - 派生模板类不调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68901995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com