gpt4 book ai didi

c++ - 为什么在构造函数中调用在 child 中实现的纯虚函数不起作用?

转载 作者:行者123 更新时间:2023-11-30 02:46:33 25 4
gpt4 key购买 nike

我试图理解为什么,以及是否可以从父构造函数调用子方法。

首先我尝试了:

#define prn printf(__FUNCTION__);printf("\r\n");

class A
{
public:
A(){init();}
~A(){prn;}

virtual void f(){}

virtual void init()=0;
};

class B : public A<B>
{
public:
B(){prn;}
~B(){prn;}

virtual void init(){prn;}
};

用纯虚拟调用粉碎。我猜是因为 A() 中的 init() 指向 A 的虚拟表中的 init() 。我用这条线确认了这一点:

virtual void init()=0{prn};

所以,我尝试了以下方法:

template<typename T>
class A
{
public:
A(){((T*)this)->init();}
~A(){prn;}

virtual void f(){}

virtual void init()=0{prn;}
};

class B : public A<B>
{
public:
B(){prn;}
~B(){prn;}

virtual void init(){prn;}
};

哪个也粉碎!现在我唯一的猜测是它发生是因为虚拟表刚刚被创建,但这只是一个猜测......

谁能解释一下这是怎么回事?

谢谢!

最佳答案

当你在基类构造函数中时,派生类的细节还没有被填充——这意味着虚函数表还没有被完全填充。虚函数表不指向任何派生类函数。

如果从基类构造函数调用虚成员函数,可能会发生以下情况:

  1. 如果基类有函数的实现,将调用它。这将是最好的情况。请记住,即使它被声明为纯虚拟,也可以在基类中定义虚拟成员函数。

  2. 如果基类没有成员函数,则函数的虚函数表中的条目可能为 NULL(初始化良好)或未初始化的内容。您可能会抛出异常或违反分段,或任何行为——您正在进入未定义行为的领域。

关于c++ - 为什么在构造函数中调用在 child 中实现的纯虚函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452383/

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