C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
当用C++覆盖一个类(使用虚拟析构函数)时,我在继承类上再次将析构函数实现为虚拟,但是我是否需要调用基本析构函数?
如果是这样,我想它就是这样......
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Run Code Online (Sandbox Code Playgroud)
我对吗?
是否有充分的理由不为类声明虚拟析构函数?什么时候应该特别避免写一个?
我在C++中定义了一个接口,即一个只包含纯虚函数的类.
我想明确禁止接口的用户通过指向接口的指针删除对象,所以我为接口声明了一个受保护的非虚拟析构函数,如:
class ITest{
public:
virtual void doSomething() = 0;
protected:
~ITest(){}
};
void someFunction(ITest * test){
test->doSomething(); // ok
// deleting object is not allowed
// delete test;
}
Run Code Online (Sandbox Code Playgroud)
GNU编译器给我一个警告说:
class'ITest'具有虚函数但非虚析构函数
一旦析构函数受到保护,虚拟或非虚拟有什么区别?
你认为这个警告可以被安全地忽略或沉默吗?
Java和C#支持的,不能用作与基类类的概念 final
和sealed
关键字.但是,在C++中,如果每个类都有一个虚拟的析构函数,那么就没有什么好的方法可以防止类的派生出于某种困境而导致类被派生出来?
编辑:从C++ 11开始,这不再是真的,你可以指定一个类final
.
一方面给一个对象一个虚拟析构函数意味着它将拥有一个vtable
并因此消耗4个(或64位机器上的8个)每个对象的附加字节vptr
.
另一方面,如果有人后来从这个类派生并通过指向基类的指针删除派生类,程序将是错误定义的(由于没有虚拟析构函数),并且坦率地优化每个对象的指针是荒谬.
在具有虚拟析构函数的抓握手上(可以说是)宣称这种类型意味着多态地使用.
有些人认为,你需要一个明确的理由不使用虚拟析构函数(如的潜台词这个问题)和其他人说,只有当你有理由相信,你的类是从派生你应该使用它们,有什么事你认为?
我有一个类是听老鼠事件.但是,我不想强迫用户实现任何特定的,但我想明确表示他们必须继承它.
有没有办法做到这一点?
谢谢
可能重复:
何时使用虚拟析构函数?
您的C++对象的析构函数何时应该virtual
?
在这些关于C++ 11/14标准的幻灯片中,在幻灯片15中,作者写道"C++ 11中的许多经典编码规则不再适用".他提出了三个例子清单,我同意三条规则和内存管理.
然而他的第二个例子是"虚拟析构函数与虚拟成员"(就是这样).这是什么意思?我知道必须声明为基类析构函数的虚拟,以便在我们有类似的东西时调用正确的析构函数
Base *b = new Derived;
...
delete b;
Run Code Online (Sandbox Code Playgroud)
这里有很好的解释:什么时候使用虚拟析构函数?
但是,如果你有虚拟成员,现在在C++ 11中声明虚拟你的析构函数是没用的吗?
您可以将对全局对象的引用用作模板参数。例如:
class A {};
template<A& x>
void fun()
{
}
A alpha;
int main()
{
fun<alpha>();
}
Run Code Online (Sandbox Code Playgroud)
在什么情况下引用模板参数可能有用?
c++ ×10
c ×1
c++11 ×1
constructor ×1
destructor ×1
gcc ×1
implementation-defined-behavior ×1
templates ×1