C++ 多态行为:交换派生的指针类型
C++ Polymorphic Behavior: swapping derived pointer types
观察以下代码:
class A { public: virtual void Foo() = 0; int Bar; };
class B : public A { public: B( float X ); void Foo(); private: float X; };
class C : public A { public: C( float Y ); void Foo(); private: float Y; };
现在,在某些函数中,假设我这样做:
A*& pToA = pToDerived; // allocated as A* pToDerived = new B( ... );
pToA = pToC; // allocated as A* pToC = new C( ... );
这有效吗?如果是这样,即使pToA
是对pToDerived
指针的引用,也会导致内存泄漏吗?
南南合作
假设Node
有 2 个或更多派生的类型。这是我目前正在实现的链表中的一个片段,它可能需要多态性才能正常工作,因为它不是通用的。 newnode
是传递给插入函数的参数。
Node* iNode;
for( iNode = mStart; iNode != mEnd; iNode = iNode->Next )
{
if ( iNode->Key == k ) // Replace current node with newnode
{
newnode->Next = iNode->Next;
newnode->Prev = iNode->Prev;
*iNode = *newnode;
delete newnode;
return; // We're done, so we quit.
}
}
// Node doesn't alreay exist, so we add it.
Node*& uglyhack = mEnd;
iNode->Next = newnode;
newnode->Prev = iNode;
uglyhack = newnode;
这与执行
相同pToDerived = pToC;
这本身并没有什么错。 仅当您像往常一样从不删除对象时,它才会泄漏内存。
在更新的代码中,您可以执行以下操作:
iNode->Next = newnode;
newnode->Prev = iNode;
mEnd = newnode;
这将是相同的。
假设您有以下内容:
// See http://codepad.org/8mG6YiLy
class A { public: virtual void Foo() = 0; int Bar; };
// Added definitions for these so that this would compile
class B : public A {
public: B( float x ) : X(x) {}
virtual void Foo() {} // Once virtual, always virtual
private: float X;
};
class C : public A {
public: C( float y ) : Y(y) {}
virtual void Foo() {}
private: float Y;
};
int main()
{
A* pToDerived = new B(3.14);
// pToDerived -> B
A*& pToA = pToDerived;
// pToDerived -> B
// pToA IS pToDerived
A* pToC = new C(2.718);
// pToDerived -> B
// pToC -> C
// pToA IS pToDerived
pToA = pToC;
// pToDerived -> C
// pToC -> C
// pToA IS pToDerived
// One object of type B no longer has pointers pointing to it
}
此代码泄漏两个对象 - 一个是 B
类型(发生在 pToA = pToC
语句中),另一个是 C
类型(在 main
返回时发生)。在这种情况下,"参考"实际上并没有在这里发挥作用。在C++中,引用只是其他某个对象的别名。您无法"重新拔插"它们。也就是说,一旦引用引用了某些内容,它就再也不能引用其他任何内容。
在本例中,当您创建 pToA 时,您创建了对指针的引用 - 在本例中指针pToDerived
。进行此引用不会影响内存管理或某些代码在正确位置调用delete
的责任。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 将派生指针分配给C 中的其他派生类型
- 如何通过派生指针调用基类中的模板成员函数
- 如何将带有恒定指针作为参数的模板的派生指针使用
- 无法返回包含派生指针的向量
- 如何创建派生指针类变量
- C++强制转换为派生指针或设计错误
- 无法从派生指针访问公共基成员
- C++发送派生指针作为参数
- 将专用基指针强制转换为专用于其他模板参数的派生指针("adding on"专用化)
- 在派生指针上显式调用基类析构函数时编译错误
- 安全派生指针值的示例
- 安全派生指针的整数表示形式
- c++多态克隆:如何从基指针获得派生指针
- 如果我将派生指针转换为基指针,这两个指针是否保证具有相同的值?
- 以任何方式将基指针强制转换为派生指针是否危险
- 将派生指针隐式强制转换为其相应基类的引用
- 当派生指针仅添加方法时,将基指针强制转换为派生指针的有效性
- c++转换指针到派生指针到基指针的例子