c++ - 当派生类中有非常量覆盖时,为什么尝试访问基类的 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;
}
解决方案
推荐阅读
- r - 为什么 lapply(file_list, function(i){} 不起作用?
- ethereum - addr.transfer(1 ether) 的可靠性错误
- sharepoint - 从 SharePoint 列表提取到 Power BI 的数据不正确
- .net-core - DisplayAttribute 在 Dotnet Core 伙伴类中不起作用
- java - 如何使用 Hibernate 检索 SQL 错误消息
- node.js - 如何运行另一个 .js 文件的内容?
- java - 我想使用 eclipse java 代码连接到 Sql Developer Database
- rust - 没有为 impl 实现特征 std::ops::Try
- algorithm - 插入排序算法许可操作
- linux - 无法在 amazon linux 实例上安装 docker