草庐IT

c++ - dynamic_cast 如何失败?

根据我的阅读,执行错误的运行时dynamic_cast可能会抛出bad_cast异常或返回零。如果你正在转换指针,它会返回零是否正确?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Base*base=newBase();dynamic_cast(base);return0;}而且它会在转换对象时抛出一个bad_cast异常?即:classBase{virtualvoida(){}};classDerived:publicBase{};intmain(){Basebase;Base&ref=base;d

c++ - 常见问题解答 : Why does dynamic_cast only work if a class has at least 1 virtual method?

这在C++中无法编译:classA{};classB:publicA{};...A*a=newB();B*b=dynamic_cast(a); 最佳答案 因为dynamic_cast只能向下转换多态类型,所以标准这么说。您可以通过向基类添加virtual析构函数来使您的类具有多态性。事实上,你可能应该无论如何(见脚注)。否则,如果您尝试通过A指针删除B对象,您将调用UndefinedBehavior.classA{public:virtual~A(){};};瞧!脚注关于在多态类型中需要虚拟析构函数的“规则”有一些异常(except

c++ - 常见问题解答 : Why does dynamic_cast only work if a class has at least 1 virtual method?

这在C++中无法编译:classA{};classB:publicA{};...A*a=newB();B*b=dynamic_cast(a); 最佳答案 因为dynamic_cast只能向下转换多态类型,所以标准这么说。您可以通过向基类添加virtual析构函数来使您的类具有多态性。事实上,你可能应该无论如何(见脚注)。否则,如果您尝试通过A指针删除B对象,您将调用UndefinedBehavior.classA{public:virtual~A(){};};瞧!脚注关于在多态类型中需要虚拟析构函数的“规则”有一些异常(except

c++ - 在 C++ 中,类函数放在内存的哪个位置?

我试图了解通过创建大量对象会导致什么样的内存损失。我知道每个对象-在创建时-将在HEAP中为成员变量分配空间,并且我认为属于该类型对象的每个函数的所有代码都存在于内存中的代码段中-永久存在。是吗?因此,如果我在C++中创建100个对象,我可以估计对象拥有的所有成员变量乘以100(此处可能存在对齐问题)需要空间,然后我需要空间在代码段中为该类型对象的每个成员函数提供一个代码拷贝(不是100个代码拷贝)。虚函数、多态性、继承因素会以某种方式影响到这个吗?动态链接库中的对象呢?我假设dll有自己的堆栈、堆、代码和数据段。简单示例(可能语法不正确)://parentclassclassBar{

c++ - 在 C++ 中,类函数放在内存的哪个位置?

我试图了解通过创建大量对象会导致什么样的内存损失。我知道每个对象-在创建时-将在HEAP中为成员变量分配空间,并且我认为属于该类型对象的每个函数的所有代码都存在于内存中的代码段中-永久存在。是吗?因此,如果我在C++中创建100个对象,我可以估计对象拥有的所有成员变量乘以100(此处可能存在对齐问题)需要空间,然后我需要空间在代码段中为该类型对象的每个成员函数提供一个代码拷贝(不是100个代码拷贝)。虚函数、多态性、继承因素会以某种方式影响到这个吗?动态链接库中的对象呢?我假设dll有自己的堆栈、堆、代码和数据段。简单示例(可能语法不正确)://parentclassclassBar{

c++ - 如何在我的 C++ 代码中避免 dynamic_cast?

假设我有以下类结构:classCar;classFooCar:publicCar;classBarCar:publicCar;classEngine;classFooEngine:publicEngine;classBarEngine:publicEngine;让我们也给Car一个句柄来处理它的Engine。FooCar将使用FooEngine*创建,BarCar将使用BarEngine*创建。有没有办法安排事情,以便FooCar对象可以调用FooEngine的成员函数而无需向下转换?这就是为什么类结构是现在这样布置的原因:所有Car都有一个Engine。此外,FooCar只会使用Fo

c++ - 如何在我的 C++ 代码中避免 dynamic_cast?

假设我有以下类结构:classCar;classFooCar:publicCar;classBarCar:publicCar;classEngine;classFooEngine:publicEngine;classBarEngine:publicEngine;让我们也给Car一个句柄来处理它的Engine。FooCar将使用FooEngine*创建,BarCar将使用BarEngine*创建。有没有办法安排事情,以便FooCar对象可以调用FooEngine的成员函数而无需向下转换?这就是为什么类结构是现在这样布置的原因:所有Car都有一个Engine。此外,FooCar只会使用Fo

c++ - 什么可能导致 dynamic_cast 崩溃?

我有一段代码看起来像这样:TAxis*axis=0;if(dynamic_cast(obj))axis=(dynamic_cast(obj))->GetXaxis();有时它会崩溃:Thread1(Thread-1208658240(LWP11400)):#00x0019e7a2in_dl_sysinfo_int80()from/lib/ld-linux.so.2#10x048c67fbin__waitpid_nocancel()from/lib/tls/libc.so.6#20x04870649indo_system()from/lib/tls/libc.so.6#30x048709

c++ - 什么可能导致 dynamic_cast 崩溃?

我有一段代码看起来像这样:TAxis*axis=0;if(dynamic_cast(obj))axis=(dynamic_cast(obj))->GetXaxis();有时它会崩溃:Thread1(Thread-1208658240(LWP11400)):#00x0019e7a2in_dl_sysinfo_int80()from/lib/ld-linux.so.2#10x048c67fbin__waitpid_nocancel()from/lib/tls/libc.so.6#20x04870649indo_system()from/lib/tls/libc.so.6#30x048709

c++ - 为什么在 C++ 内存管理中,术语 "automatic"和 "dynamic"优于术语 "stack"和 "heap"?

关于SO的许多问题和答案,我了解到最好将其生命周期管理为驻留在自动存储而不是堆栈中的对象。此外,动态分配的对象不应被称为驻留在堆上,而是在动态存储中。我知道存在自动、动态和静态存储,但从未真正理解自动堆栈和动态堆之间的区别。为什么首选前者?我不是在问堆栈/堆是什么意思或内存管理是如何工作的。我在问为什么术语自动/动态存储优于术语堆栈/堆。 最佳答案 自动告诉我一些关于对象生命周期的信息:特别是它被自动绑定(bind)到封闭范围,并将被自动销毁>当该范围退出时。动态告诉我对象的生命周期不是由编译器自动控制的,而是在我的直接控制之下。S