如何删除在函数中使用父指针作为形参的子类指针?
Posted
技术标签:
【中文标题】如何删除在函数中使用父指针作为形参的子类指针?【英文标题】:How to delete subclass pointer where use parent pointer as formal parameters in function? 【发布时间】:2021-01-24 07:11:19 【问题描述】:我在删除子类点时遇到一个问题。我想删除子类指针使用父类指针作为形式参数。还有我的代码如下。
class Test
public:
virtual ~Test() = default;
int a =10;
;
class TestChild : public Test
public:
int c ;
;
class A
public:
A()
TestChild* tc = new TestChild();
tc->c = 19;
delTest(tc);
void delTest(Test* &ds)
delete ds;
ds = nullptr;
;
编译项目会报错:
cannot bind non-const lvalue reference of type 'Test*&' to an rvalue of type 'Test*'
如果我将函数修改为void delTest(Test**ds) delete *ds; *ds=nullptr;
和delTest(&tc);
,也会报错:
invalid conversion from 'TestChild**' to 'Test**'
我需要做什么才能使我的代码正常工作?
【问题讨论】:
如果函数参数为Test * & ds
,则需要传递对Test *
的引用。
在我的代码中,当函数参数为Test * &
时,我认为tc
是对Test *
的引用。但它没有奏效。这里还有其他错误吗? @user7860670
我确实将我的析构函数设为virtual
,但我没有在我的问题中编码。对此我很抱歉。感谢您的回答。@Ted Lyngmo
tc
is TestChild *
尝试将Test *
的引用绑定到TestChild *
类型的对象是这里出错的原因。请注意,即使 TestChild
派生自 Test
,指向这些类型的指针也是不相关的类型。
非常感谢。现在我知道了这个错误的原因。我找到了解决它的方法。我想我需要更多地了解 C++。再次感谢你。 @user7860670
【参考方案1】:
我需要做什么才能使我的代码正常工作?
您可以制作函数模板以支持delete
和delete[]
+ 将指针设置为nullptr
:
template<typename T>
void delete_and_nullify_single_element_pointer(T*& ptr)
delete ptr;
ptr = nullptr;
template<typename T>
void delete_and_nullify_array_pointer(T*& ptr)
delete[] ptr;
ptr = nullptr;
class A
public:
A()
TestChild* tc = new TestChild;
tc->c = 19;
delete_and_nullify_single_element_pointer(tc);
;
【讨论】:
以上是关于如何删除在函数中使用父指针作为形参的子类指针?的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )