当 “has no member named“ 类型的错误涉及到继承和虚函数时的解决方案

本文介绍了当遇到C++中'has no member named'错误时,涉及继承和虚函数的解决方案。重点检查基类和派生类的成员访问、虚函数覆盖、对象类型和指针类型、抽象类的纯虚函数实现、访问权限以及多重和虚继承等问题。同时,强调了虚函数在实现多态中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当 “has no member named” 类型的错误涉及到继承和虚函数时,解决方案具体步骤:

  1. 检查基类和派生类

    • 确保您正在尝试访问的成员确实在基类中声明。如果成员是在派生类中定义的,那么您不能通过基类的引用或指针直接访问它。
    • 如果成员函数在基类中声明为虚函数,确保在派生类中正确地覆盖它(包括相同的函数签名)。
  2. 函数覆盖(Overriding)

    • 在派生类中覆盖虚函数时,确保函数的签名完全匹配,包括返回类型、函数名、参数列表以及const修饰符。
    • 使用 C++11 的 override 关键字可以让编译器帮助检查覆盖是否正确。
  3. 虚函数的默认实现

    • 如果基类提供了虚函数的默认实现,并且您在派生类中没有覆盖它,确认是否是在派生类的实例上调用这个函数。
  4. 对象类型和指针类型

    • 检查您使用的是基类的指针还是派生类的指针。基类指针只能访问基类中定义的成员和派生类中覆盖的虚函数。
    • 如果需要访问派生类特有的成员,您需要使用派生类的指针或引用,或者将基类指针动态转换为派生类指针(使用
#include "../utils.h" #include "StringLengthVariance.h" #include <algorithm> #include <vector> std::vector<std::shared_ptr<StringBase>> StringLengthVariance::mutated_elements; StringLengthVariance::StringLengthVariance(std::shared_ptr<StringBase> obj, std::mt19937 &rand) : IntegerVariance(std::static_pointer_cast<StringBase>(obj), rand, false) {} std::pair<int64_t, int64_t> StringLengthVariance::get_limits(std::shared_ptr<StringBase> obj) { /* TODO:获取长度边界代码待完善 */ int64_t max_output_size_bits = static_cast<int64_t>(obj->mutator_config.max_output_size * 8); int64_t size_bits = llrint(obj->calculate_bit_size()); int64_t limit_bits = std::max(max_output_size_bits, size_bits); int64_t limit_bytes = (limit_bits + 7) / 8; int64_t max_length = limit_bytes; if (obj->max_length != nullptr) { max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); } int64_t min_length = 0; if (obj->min_length.has_value()) { min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); } return {min_length, max_length}; } int64_t StringLengthVariance::get_value(std::shared_ptr<StringBase> obj) { return std::min(static_cast<int64_t>(obj->value.size()), max_); } void StringLengthVariance::perform_mutation(std::shared_ptr<StringBase> obj, int64_t value) { obj->mutated_value = expand(obj->value, static_cast<size_t>(value)); obj->mutated = true; mutated_elements.push_back(obj); } bool StringLengthVariance::supported(std::shared_ptr<StringBase> obj) { return std::dynamic_pointer_cast<StringBase>(obj) != nullptr; } std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { return mutated_elements; }报错/data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: In member function ‘virtual std::pair<long int, long int> StringLengthVariance::get_limits(std::shared_ptr<StringBase>)’: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:24:25: error: request for memberhas_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 24 | if (obj->max_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:25:81: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 25 | max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:28:25: error: request for memberhas_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 28 | if (obj->min_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:29:73: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 29 | min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: At global scope: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: error: no declaration matches ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ 48 | std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { | ^~~~~~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: note: no functions named ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:13:7: note: ‘class StringLengthVariance’ defined here 13 | class StringLengthVariance : public IntegerVariance { | ^~~~~~~~~~~~~~~~~~~~
最新发布
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小秋slam实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值