“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”调用函数的主要内容,如果未能解决你的问题,请参考以下文章