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

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);
    
;

【讨论】:

以上是关于如何删除在函数中使用父指针作为形参的子类指针?的主要内容,如果未能解决你的问题,请参考以下文章