gpt4 book ai didi

c++ - 将基类型动态转换为派生类型。调用了非虚函数但虚函数导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 16:09:16 25 4
gpt4 key购买 nike

这是我的代码的简化形式

#include <iostream>

class base
{
public:
void func1()
{
std::cout<<"In base func1"<<std::endl;
}
void func2()
{
std::cout<<"In base func2"<<std::endl;
}

virtual void func4()
{
std::cout<<"In base func4"<<std::endl;
}

virtual void func5()
{
std::cout<<"In base func5"<<std::endl;
}
};

class derived : public base
{
public:
void func1()
{
std::cout<<"In derived func1"<<std::endl;
}

void func3()
{
std::cout<<"In derived func3"<<std::endl;
}

void func5()
{
std::cout<<"In derived func5"<<std::endl;
}
};

int main()
{
derived* ptr = dynamic_cast<derived*>(new base());

if(ptr == NULL)
{
std::cout<<"Cast failed"<<std::endl;
}

ptr->func1();
ptr->func2();
ptr->func3();
ptr->func4();
ptr->func5();

delete ptr;
}

将基对象动态转换为派生类型会返回 NULL 指针。这应该会导致 ptr->func1() 处的段错误。然而,我的输出是

Output:
Cast failed
In derived func1
In base func2
In derived func3

当 ptr->func4() 尝试执行时代码崩溃。如果指针为 NULL,则访问任何函数,无论是虚拟函数还是非虚拟函数,都应该出现段错误。有人可以解释治疗这两种类型的区别吗。

enter image description here

最佳答案

您的主张,

This should lead to segmentation fault at ptr->func1().

完全没有根据,而且确实是错误的。 C++ 语言中没有“段错误”,也没有任何东西可以保证在发生未定义行为 时发生任何类型的崩溃,这正是您所拥有的。您的程序的行为根本不是由 C++ 语言定义的。这与定义为崩溃不同。

关于c++ - 将基类型动态转换为派生类型。调用了非虚函数但虚函数导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427212/

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