在大型单线程C ++应用程序中(使用GCC 4.4.7 20120313编译),简单指针赋值不等于原始指针值:
class DvComVectorStreamBase : virtual public std::ios
{
// some stuff here
};
class DvComVectorOStream : public DvComVectorStreamBase, public std::ostream
{
public:
DvComVectorOStream(int which = std::ios::out, size_t capacity = 0) :
DvComVectorStreamBase(which, capacity)
{}
};
class Formatter : public aStandAloneClass
{
// cruft removed
protected:
void initFunction();
ostream* mpStream;
DvComVectorOStream* mpVectorOStream;
}
Formatter:initFunction()
{
printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
if (mpVectorOStream == 0)
mpVectorOStream = new DvComVectorOStream(ios::out, 32768);
else
mpVectorOStream->clear();
printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
mpStream = mpVectorOStream;
printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
}
输出
mpStream (nil) mpVectorOStream (nil)
mpStream (nil) mpVectorOStream 0x90ccc98
mpStream 0x90ccccc mpVectorOStream 0x90ccc98
尝试在一个简单的测试用例中重现问题很好。
分配后,mpStream和mpVectorOStream不应该具有相同的值吗?
即。如果两个指针都指向同一个对象,那么每个指针应该包含相同的值,不是吗? (不是赋值运算符的全部意义吗?)
答案 0 :(得分:5)
当一个类有多个基类时,只有第一个类与子类的地址相同,所以当你将子类指针转换为基类指针时,指针的值可能会改为指向基类子类实例中的实例。
类似地,当您将基类指针转换为子类指针时,该值可能需要更改为指向包含的子类
即使对于单继承,当派生类具有v表而基类不具有时,也会发生类似的调整。