首页 > 解决方案 > 当派生类中有非常量覆盖时,为什么尝试访问基类的 const 函数编译失败?

问题描述

假设我有一个类Base,它具有相同函数的 const 和非常量版本,并且非常量版本是虚拟的。然后我有一个Derived覆盖非常量版本的类。如果我的Derived变量是 const,为什么访问这个函数编译失败?我可以通过 const 基类指针访问 const 版本,但为什么不能通过派生类呢?

这是一个最小的、可验证的示例:

#include <string>

using namespace std;

class Base
{
public:
    virtual string& GetString() = 0;

    const string& GetString() const 
    {
        return const_cast<Base*>(this)->GetString();
    }
};

class Derived : public Base
{
public:
    string& GetString() override { return str; };
private:
    string str = "hello world";
};

int main()
{
    Derived Obj;
    Obj.GetString(); // Compiles correctly

    const Base* BasePtr = new Derived;
    BasePtr->GetString(); // Compiles correctly

    const Derived* DerivedPtr = new Derived;
    static_cast<const Base*>(DerivedPtr)->GetString(); // Compiles correctly

    const Derived ConstObj;
    ConstObj.GetString(); // error: passing ‘const C’ as ‘this’ argument discards qualifiers


    delete BasePtr;
    delete DerivedPtr;
    return 0;
}

标签: c++inheritanceconstantsvirtual

解决方案


推荐阅读