草庐IT

fluid-dynamics

全部标签

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++ 代码中避免 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++ - 虚拟析构函数 : is it required when not dynamically allocated memory?

如果我的类不动态分配任何内存,我们是否需要虚拟析构函数?例如classA{private:inta;intb;public:A();~A();};classB:publicA{private:intc;intd;public:B();~B();};在这种情况下,我们需要将A的析构函数标记为虚拟吗? 最佳答案 问题不在于您的类是否动态分配内存。如果类的用户通过A指针分配B对象,然后将其删除:A*a=newB;deletea;在这种情况下,如果A没有虚拟析构函数,C++标准会说您的程序表现出未定义的行为。这可不是什么好事。此行为在标准的

c++ - 虚拟析构函数 : is it required when not dynamically allocated memory?

如果我的类不动态分配任何内存,我们是否需要虚拟析构函数?例如classA{private:inta;intb;public:A();~A();};classB:publicA{private:intc;intd;public:B();~B();};在这种情况下,我们需要将A的析构函数标记为虚拟吗? 最佳答案 问题不在于您的类是否动态分配内存。如果类的用户通过A指针分配B对象,然后将其删除:A*a=newB;deletea;在这种情况下,如果A没有虚拟析构函数,C++标准会说您的程序表现出未定义的行为。这可不是什么好事。此行为在标准的

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

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

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

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