“No-Const Pointer to Const”调用函数

Posted

技术标签:

【中文标题】“No-Const Pointer to Const”调用函数【英文标题】:"No-Const Pointer to Const " call function 【发布时间】:2018-10-02 02:22:01 【问题描述】:

我必须像这样抛出一个指针。我想在主类中调用 Derived 的函数。

using namespace std;
class Base
    
    public: 
        virtual ~Base() ;
        virtual const char * what()  return "Base"; ;
        int value = 0;
    ;

class Derived : public Base

public:
    ~Derived() ;
    const char * what()  return "Derived"; ;
    int value = 1;
;

int main()

    try
    
        throw new Derived();
    
    catch (Base const * b)
    
        //HOW TO CALL b->what();
        delete b;
    

当我尝试调用 what() 函数时,出现错误对象具有与成员函数“Base::what”不兼容的类型限定符 你能告诉我一个解决方案吗? 谢谢。

【问题讨论】:

what 方法不是 const 方法。 您不能调用what(),因为它只能为可变对象调用,而您的指针是const 指针。要么将基类或派生类中的 what() 更改为 const 类方法,要么捕获一个非常量指针。 因为这个类会扩展std::exception所以......无论如何,如果我抓住(Base *b),我还能删除b而不发生内存泄漏吗? 【参考方案1】:

Base const* b 表示b 是一个指向不可变对象(const 对象)的指针。在c++中,不可变对象只能使用const方法,const方法的一个例子是:

class Base

public:
   int method1(/*some parameters*/) const  //this is a const method
   
      //do something
    
   const int method2(/*some parameters*/)  //this is NOT a const method
   
     //do something
   

因此,您必须将 b 更改为普通指针,而不是指向 const 对象的指针。或者将 what() 设为 const 方法。

【讨论】:

因为这个类将扩展 std::exception 那么什么是方法覆盖...无论如何,如果我捕获 (Base *b),我还能删除 b 而不会发生内存泄漏吗? 对不起,我不明白你的意思? 我想抛出一个指针异常,调用它的一个方法,并在我捕获它时将其删除。如果我捕获 (Base const * b) 我可以删除而不会发生内存泄漏,但不能调用方法,如果我捕获 (Base * b) 我可以调用但不能删除它,则会发生内存泄漏。 "what()" 方法是 std::exception 的方法,我只是覆盖它。

以上是关于“No-Const Pointer to Const”调用函数的主要内容,如果未能解决你的问题,请参考以下文章