C++编译器是否生成默认函数,如构造器/析构函数/复制-构造器.为了这个“课”?
class IMyInterface
{
virtual void MyInterfaceFunction() = 0;
}我的意思是不可能实例化这个“类”,所以我认为不会生成默认函数。否则,人们会说你必须使用虚拟析构函数。这意味着,如果我没有定义析构函数虚拟,它将是默认创建,而不是虚拟。
此外,我还想知道为一个纯虚拟接口定义一个虚拟析构函数是否合理,就像上面的那个吗?(因此这里没有使用指针或数据,因此不需要销毁任何东西)
谢谢。
发布于 2014-01-23 11:40:15
此外,我还想知道为一个纯虚拟接口定义一个虚拟析构函数是否合理,就像上面的那个吗?(因此这里没有使用指针或数据,因此不需要销毁任何东西)
这不仅是合理的,也是推荐的。这是因为在虚拟函数层次结构的情况下,调用专门类的析构函数也会调用其基类的所有析构函数。如果没有定义它们,您应该得到一个链接错误。
如果您在类中定义了至少一个虚拟函数,则还应该定义一个虚拟析构函数。
但是,可以用=default定义析构函数:
下面是一个更正的(可编译的)代码示例:
class ImyInterface
{
virtual void myInterfaceFunction() = 0;
virtual ~ImyInterface() = 0;
}
ImyInterface::~ImyInterface() = default;发布于 2014-01-23 11:41:59
是的,
没有任何措辞要求类是可实例化的,以便隐式声明这些特殊的成员函数。
这是有意义的--仅仅因为不能实例化Base,并不意味着派生类不想使用这些函数。
struct Base
{
virtual void foo() = 0;
int x;
};
struct Derived : Base
{
Derived() {}; // needs access to Base's trivial implicit ctor
virtual void foo() {}
};请参见:
发布于 2014-01-23 14:12:15
此外,我还想知道为一个纯虚拟接口定义一个虚拟析构函数是否合理,就像上面的那个吗?(因此这里没有使用指针或数据,因此不需要销毁任何东西)
派生类会在其析构函数中执行任何操作吗?你能确定他们永远不会,即使是当别人接管发展?
拥有一个虚拟析构函数的全部意义不在于确保基类被正确地销毁,这无论如何都会发生。要点是,当使用泛型接口时,调用派生类的析构函数:
struct A {
virtual ~A() {}
virtual int f() = 0;
};
class B : public A {
std::ifstream fh;
public:
virtual ~B() {}
virtual int f() { return 42; }
};
std::shared_ptr<A> a = new B;当a超出范围时,为什么关闭ifstream?因为析构函数使用虚拟析构函数删除对象。
https://stackoverflow.com/questions/21306976
复制相似问题