如何删除在函数中使用父指针作为形参的子类指针?

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】:

我需要做什么才能使我的代码正常工作?

您可以制作函数模板以支持deletedelete[] + 将指针设置为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语言-指针作为函数形参类型

c++ 虚函数 如何调父类 而非子类

C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

c语言中,函数的形参啥时候必须是指针

调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?

函数指针(函数指针作为函数形参/函数类型作为函数返回类型)