我有一些代码看起来有点像这样:
void writeToStream( std::ostream & outputStream )
{
MyXmlWriter xmlWriter{ outputStream };
xmlWriter.addNode();
xmlWriter.addNode();
xmlWriter.close(); // should this be called in `MyXmlWriter` destructor?
}
close函数写入一些xml关闭标记,以便正确地解析该文件。构造函数写入xml文件的头。人们可以考虑使用xmlW
我有两个类,一个是从ostream继承的,另一个是从streambuf继承的,我就是这样使用它们的
int main () {
stampstream ss(8,10);
}
Stampstream
stampstream::stampstream(int r, int c) : ostream(new stampbuf(r,c))
{
std::cout << "I am in stampstream" << std::endl;
}
我只是调用父类(ostream)类ctor,并在参数中创建一个stampbuf类的对象。
Stampbuf
我遇到了一个基类,它的析构函数是非虚的,尽管基类有一个虚函数fv()。这个基类也有很多子类。这些子类中有许多定义了自己的fv()。
我不知道在程序中如何使用基类和子类的细节。我只知道程序运行得很好,即使基类的析构函数也应该是虚的。
我想把基类的析构函数从非虚改为虚,但我不确定会有什么后果。那么,会发生什么呢?我还需要做些什么才能确保程序在我更改后工作正常?
后续:在我将基类的析构函数从非虚拟改为虚拟之后,程序在一个测试用例中失败了。
结果把我搞糊涂了。因为如果基类的析构函数不是虚的,那么程序就不会多态地使用基类。因为如果不这样做,就会导致未定义的行为。例如,Base *pb = new Sub
正如在中提到的,简单地第二次调用析构函数已经是未定义的行为12.4/14(3.8)。
例如:
class Class {
public:
~Class() {}
};
// somewhere in code:
{
Class* object = new Class();
object->~Class();
delete object; // UB because at this point the destructor call is attempted again
}
在这个例子中,类的设计方式使得析构函数可以被多次调用--不会发生双重删除这样的事情。