首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过引用将派生类传递给运算符会产生错误

。这是因为在C++中,运算符重载是不支持多态的,即无法通过引用或指针传递派生类对象给运算符重载函数。

当我们定义一个运算符重载函数时,它只能接受基类对象作为参数,而无法接受派生类对象。这是因为派生类对象包含了基类对象的成员,但基类对象不包含派生类对象的成员。因此,如果我们尝试通过引用将派生类对象传递给运算符重载函数,编译器会报错。

为了解决这个问题,我们可以使用虚函数来实现多态性。通过在基类中声明虚函数,并在派生类中重写这些虚函数,我们可以实现对派生类对象的正确操作。然后,我们可以通过引用或指针传递基类对象,以便在运算符重载函数中调用适当的虚函数。

总结起来,通过引用将派生类传递给运算符会产生错误,因为运算符重载不支持多态。为了解决这个问题,可以使用虚函数来实现多态性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++:52---多重继承

}; 上面的D1从Base1和Base2中继承了所有的构造函数,但是Base1与Base2中都有一个参数为“const std::string&”的构造函数,因此编译器产生错误 为了解决上面的错误,必须自己显式地在本类中定义可能会产生二义性的构造函数...使用合成版本 如果派生类没有定义自己的拷贝/赋值构造函数和赋值运算符,那么在执行这些操作时将会自动调用基类的拷贝/赋值构造函数和赋值运算符 七、基类与派生类的类型转换 与单一继承原理一致,可以将一个派生类赋值给一个基类...Panda对象传递给一个Bear引用 highlight(ying_yang); //将一个Panda对象传递给一个Endangered引用 cout 将一个Panda对象传递给一个ZooAnimal引用 return 0; } 注意函数重载与二义性错误 编译器不会在派生类向基类的转换中进行比较和选择,因为在它看来转换到任意一种基类都一样。...return 0; } 基于指针类型或引用类型的查找 与单一继承原理一致,对象、引用、指针的静态类型决定了我们能够使用哪些成员 例如: 我们使用一个ZooAnimal指针指向于一个派生类,那么只能通过这个指针访问属于

96230

《逆袭进大厂》第三弹之C++提高篇79问79答

指针和引用之间如何转换? 1) 向上类型转换 将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。...函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数; 5) 两种方法赋值: 指针名 = 函数名; 指针名 = &函数名 114、 内存泄漏的后果?...闭包的一个强大之处是其可以通过传值或者引用的方式捕捉其封装作用域内的变量,前面的方括号就是用来定义捕捉模式以及变量,我们又将其称为lambda捕捉块。...拷贝构造函数用来初始化一个非引用类类型对象,如果用传值的方式进行传参数,那么构造实参需要调用拷贝构造函数,而拷贝构造函数需要传递实参,所以会一直递归。 149、你知道空类的大小是多少吗?...当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。

2.2K30
  • 【笔记】《C++Primer》—— 第三部分:类设计者的工具

    但引入了右值引用的根本目的是解决完美转发问题,即让我们在一些例如传参的时候可以直接使用临时变量本身的值来传递而不经过拷贝的性能消耗,由于我们要直接使用临时变量就打上了无用变量的标记。...我们很多时候希望的是我们通过将基类指针指向派生类,然后可以动态调用派生类的函数,这时我们可以将基类的对应函数写为虚(virtual)函数来实现,此时发生的称为动态绑定 派生类可以继承多个基类,称为多继承...,而不会产生覆盖。...编译器是从模板函数的调用中推断具体的实参类型的要求在16.2中有详细介绍 如果我们通过类型别名或模板参数之类的方法间接定义了引用的引用(正常情况下无法定义),会产生引用的“折叠”,(X&)&,(X&)...&&,(X&&)&都折叠为X&,(X&&)&&折叠为X&&,也就是删去两个引用符 左值如i传递给模板类型的右值引用时,编译器会推断参数类型为左值引用i& 直接利用右值引用参数会丧失右值引用属性,这时我们可以通过让右值引用后进入函数的参数调用

    1.7K10

    QT(C++)面试总结

    2)访问权限 派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员; 通过派生类的对象:只能访问public成员。...多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。...,不能被改变; ⑦指针可以有多级指针(**p),而引用至于一级; ⑧指针和引用使用++运算符的意义不一样; ⑨如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。...参数传值、指针、引用有什么区别,在什么场景常用哪种传递方式? 传值、传址、传引用的区别,哪个更高效?...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 (3) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

    2.1K10

    c++面试题

    C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现; 在程序编译时多态性体现在函数和运算符的重载上 虚函数:在基类中冠以关键字 virtual 的成员函数。...(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处...因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。...根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。 13....“引用”与多态的关系? 引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

    1.2K21

    C++ 面试必备:常见 C++ 面试题汇总及详细解析

    int* p = new int; delete p; p = nullptr; // 置空指针,避免野指针产生// 以下代码会产生错误,因为指针 p 已经被释放delete 避免使用悬空指针 当一个指针变量超出了其所在作用域或者被删除时...C++基类的析构函数声明为虚函数是为了确保在通过基类的指针或引用删除派生类对象时,可以正确地释放派生类对象所占用的内存。...数组解引用 可以通过数组下标访问数组元素,也可以使用指针进行访问,但是需要注意的是,使用指针访问数组元素需要先将指针解引用,即使用 * 运算符。例如:*p 表示 p 指向的对象。...函数返回时,会跳转回调用它的函数的位置。此时,程序会弹出函数栈帧,将返回值传递给调用者,并恢复调用者的寄存器和栈。 左值和右值 左值和右值 ??...内存分配失败时的处理方式不同:当内存分配失败时,malloc会返回NULL,并需要手动释放已经分配的内存空间;而new会抛出std::badalloc异常,程序可以通过异常捕获机制来处理。

    2.2K30

    c++面试选择题_C语言经典笔试题

    因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。...根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。 20.简述数组与指针的区别?...,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数)。...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 (2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

    1.1K10

    C++查缺补漏

    无法通过返回值区分 构造函数 默认构造函数 //下面两个都是默认构造函数,如在类中同时出现,将产生编译错误: Clock(); Clock(int newH=0,int newM=0,int newS...复制构造函数只能接受一个参数,既用来初始化派生类定义的成员,也将被传递给基类的复制构造函数 基类的复制构造函数形参类型是基类对象的引用,实参可以是派生类对象的引用 例如: C::C(const C &...当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性 虚基类声明 以virtual说明基类继承方式 例:class B1:virtual...public B 作用 主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题 为最远的派生类提供唯一的基类成员,而不重复产生多次复制 注意: 在第一级继承时就要将共同基类设计为虚基类 虚基类及其派生类构造函数...- 在虚函数显式重载中运用,编译器会检查基类是否存在一虚拟函数,与派生类中带有声明override的虚拟函数,有相同的函数签名(signature);若不存在,则会回报错误 多态行为的基础:基类声明虚函数

    2.6K10

    当类构造与析构的时候...

    赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。...,那么浅复制出来的对象也会相应改变。...向上类型转换 将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。...向下类型转换 将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个基类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须加动态类型识别技术...1、直接将拷贝构造函数写在私域里。 2、起一个基类,将类的拷贝函数设为私有,在项目中比较优雅。 参考:muduo网络库源码实现。

    64520

    【笔记】《Effective C++》条款1-25

    但是在多线程环境中又有问题, 所有static成员之间可能会产生竞速关系....析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程中调用虚函数 补偿方法是将需要让派生类执行的函数以非虚函数的形式写好, 然后将其所需的变量通过构造函数在构造初值列中进行传递...., 也就是由拷贝构造函数生成 因此如果只是简单地传入对象会浪费很多的构造/析构操作, 最好的做法是传const引用 传const是为了让调用的人放心传入, 同时传入引用还能避免对象切割问题(派生类传入声明为基类的参数时派生类会退化为基类...), 起到多态的效果 传引用的底层实现是指针, 因此对于内置类型和STL迭代器与STL函数对象, 传值的效率会高于传引用, 这是底层决定的...., 因为大多数运算符都需要符合交换律, 而此时如果是成员函数, 调用函数的对象本身并不处于参数列中, 这会导致调用错误), 应该使用非成员函数然后写入所有所需的参数 member的反面是non-member

    1.1K30

    《C++Primer》第十五章 面向对象程序设计

    对虚函数的调用可能在运行时才被解析 当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本呢的函数。...如果一个虚函数需要调用它的基类版本,但是没有使用作用域运算符,那么会导致无限递归。 抽象基类 1....通过作用域运算符来使用隐藏的成员 struct Derived : Base { int get_base_mem() { return Base::mem; } // ... } 作用域运算符将覆盖原有的查找规则...,则编译器产生的代码将在运行时确定到底运行虚函数的哪个版本,依据是对象的动态类型 如果mem不是虚函数或者我们是通过对象(非引用或者指针)进行调用,则编译器将产生一个常规函数调用 5....当我们为派生类定义拷贝或者移动构造函数时,我们通常使用对应的基类构造函数初始化对象的基类部分: // 初始值Base(d)将一个D对象传递给基类构造函数,Base(d)会去匹配Base的拷贝构造函数,将

    1.2K20

    精选 30 个 C++ 面试题(含解析)

    因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。...根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2)有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。 20.简述数组与指针的区别?...,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数)。...当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。

    2.3K30

    【C++】基础:Effective C++高效编程建议

    让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用) 11....用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值) 21. 当你必须返回一个对象时不要试图返回一个引用 22....只要可能就用const 将某些东西声明为 const 有助于编译器发现使用错误。...用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值) 用传引用给 const 取代传值。典型情况下它更高效而且可以避免切断问题。...避免返回对象内部构件的“句柄” 避免返回对象内部构件的句柄(引用,指针,或迭代器)。这样会提高封装性,帮助 const 成员函数产生 const 效果,并将空悬句柄产生的可能性降到最低。 29.

    22710

    C++经典面试题(最全,面中率最高)

    因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error! 注意事项: (1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。...根据前面提到的引用作为返回值的三个规则,2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。 20.简述数组与指针的区别?...,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数)。...而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 (2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

    2.1K30

    《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

    若一个对象是使用new运算符创建的,在使用delete运算符释放它时,delete会自动调用析构函数。...Student(char *name1, float score1); ~Student(); private: char *name; float score; }; 如下语句会产生错误...在向函数传递对象时,是通过“传值调用”的方法传递给函数的。因此,函数中对对象的任何修改均不影响调用该函数的对象(实参本身)。...如果希望程序执行动态连编方式,在用delete运算符撤销派生类的无名对象时,先调用派生类的析构函数,再调用基类的析构函数,可以将基类的析构函数声明为虚析构函数。...首先,它是类型安全的、可以防止格式控制符与输入输出数据的类型不一致的错误。另外,C++可以通过重载运算符“>>”和”<<“,使之能用于用户自定义类型的输入和输出,并且向预定义类型一样有效方便。

    3.4K40

    【c++】异常

    而且assert的目的是让程序员在debug模式下将所有错误都解决release模式下assert并不会产生作用。...异常使得我们可以将问题的检测与解决问题的检测与解决过程分离开程序的一部分负责检测问题的出现,然后解决该问题的任务传递给程序的另一部分。检测环节无需知道问题处理模块的所有细节,反之亦然。...3.2 异常的重新抛出 有可能单个的 catch 不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用 链函数来处理, catch 则可以通过重新抛出将异常传递给更上层的函数进行处理...在成员函数中noexcept出现在需要跟在const及引用限定符后面,而final(修饰虚函数,表示该虚函数不能再被重写)、 override(检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错...4.3noexcept运算符 他是一个一元运算符,他的返回值为一个bool类型的右值常量表达式,表示是否给定表达式会抛出异常(和sizeof类似)也不会求其运算对象的值。

    18910

    【C++篇】继承之韵:解构编程奥义,感悟面向对象的至高法则

    2.2.2 基类指针和引用的转换 派生类对象可以赋值给基类的指针或引用,这是实现多态的重要前提条件。通过基类指针或引用,程序可以在运行时动态绑定到派生类的成员函数。...派生类对象 s 被传递给基类引用 p,并正确调用了 Student 类的重写函数 Print()。 2.2.3 强制类型转换的使用 在某些特殊情况下,基类指针或引用可能需要转换为派生类的指针或引用。...3.2.2 拷贝构造函数与赋值运算符的调用 当派生类对象被拷贝时,基类的拷贝构造函数会先被调用,然后才是派生类的拷贝构造函数。...同样,赋值运算符的调用顺序也遵循这一规则:基类的赋值运算符会先于派生类的赋值运算符被调用。...通过将基类的析构函数声明为 virtual,当通过基类指针删除派生类对象时,派生类的析构函数将首先被调用,从而确保所有派生类的资源被正确释放。

    11510

    两万字总结《C++ Primer》要点

    编译->链接 6.2 参数传递 当形参是引用类型,这时它对应的实参被引用传递或者函数被传引用调用。 当实参被拷贝给形参,这样的实参被值传递或者函数被传值调用。...(1)传值参数 (2)被引用传参 (3)const形参和实参 (4)数组形参 为函数传递一个数组时,实际上传递的是指向数组首元素的指针。...return; return expression; 函数完成后,它所占用的存储空间也会随着被释放掉。 ::: warning 返回局部对象的引用是错误的;返回局部对象的指针也是错误的。...(1)右值引用 可通过move函数开获得绑定到左值上的右值引用。...如果表达式既不是引用也不是指针,则动态类型与静态类型永远一致。 不存在基类向派生类隐式类型转换: Quote base; Bulk_quote *bulkP = &base; // 错误!

    1.8K20
    领券