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

How to delete subclass pointer where use parent pointer as formal parameters in function?

删除子class点时遇到问题。我想删除 subclass 指针使用 parent class 指针作为形式参数。我的代码如下。

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**'

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

What do I need to do to make my code work?

您可以创建函数模板以支持 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);
    }
};