不能将“this”指针从“const Vehicle”转换为“Vehicle &”

本文探讨了C++中const对象调用非const成员函数导致的编译错误,并解释了错误的原因及如何避免此类问题。


错误提示:

error C2662: “Vehicle::copy”: 不能将“this”指针从“const Vehicle”转换为“Vehicle &”;


错误原因:由于让const对象调用了非const的成员函数导致;

结论:const对象只能调用const的成员函数;非const对象既可以调用const的成员函数,也可以调用非const的成员函数;

任务描述: 模拟实现以下类并完成相应功能: 交通工具类(Vehicle)描述了不同交通工具的共有特点。汽⻋(Car)、船 (Boat)、⽔陆两⽤汽⻋(AmphibianCar)分别描述了三种不同的交通工 具。具体说明如下: Vehicle 类为 Car 和 Boat 的抽象基类,有一个访问权限为 protected、string 类型的成员 name 。 Vehicle 类有一个 drive() 纯虚函数,不同子类的重写 (overwrite)方式不同,详见样例。 AmphibianCar 类继承 Car 和 Boat 两个基类,满足以下要求: AmphibianCar 类仍继承 Car 和 Boat 两个基类, 并额外实现 2 个方法 driveAsCar() 与 driveAsBoat()(参考样例1) 当通过不同的父类指针绑定函数时,drive() 函数将根据父类的指针类型输出不同内容,以体现多态性。具体来说,当父类指针为 Car 时,drive() 的输出与 driveAsCar() 一致;为 Boat 时,与 driveAsBoat() 一致 (参考样例2) 你应该明白,虽然水陆两用车可以在水上航行也可以在路上驾驶,但它不可能同时出现在水里和路上。 提示 测试用例中,AmphibianCar 类的指针或对象不会直接调用 drive() 方法。 虚继承与普通多继承有什么区别?使用虚继承会解决/带来什么问题?多继承带来的问题还有哪些解决方式? 测试样例 样例1 输入: Vehicle* C = new Car("My car"); C->drive(); // 输出Vehicle name + " drive on road" Vehicle* B = new Boat("My boat"); B->drive(); // 输出Vehicle name + " drive on river" AmphibianCar* A = new AmphibianCar("My amphibian car"); A->driveAsCar(); // 输出Vehicle name + " drive on road as car" A->driveAsBoat(); // 输出Vehicle name + " drive on river as boat" 输出: My car drive on road My boat drive on river My amphibian car drive on road as car My amphibian car drive on river as boat 样例2 输入: AmphibianCar* A = new AmphibianCar("My amphibian car"); Car* CarMode = A; Boat* BoatMode = A; CarMode->drive(); // 将Car中的drive()方法重写为driveAsCar() BoatMode->drive(); // 将Boat中的drive()方法重写为driveAsBoat() 输出: My amphibian car drive on road as car My amphibian car drive on river as boat // #include "Vehicle.h" // Your code here #include <iostream> #include<string> using namespace std; class Vehicle{ protected: string name; public: Vehicle(const string &name):name(name){} virtual void drive()=0; virtual ~Vehicle()=default; }; class Car:virtual public Vehicle{ public: Car(const string &name):Vehicle(name){} virtual void drive()override{ cout<<name<< " drive on road"<<'\n'; } }; class Boat:virtual public Vehicle{ public: Boat(const string &name):Vehicle(name){} virtual void drive()override{ cout<<name<< " drive on river"<<'\n'; } }; class AmphibianCar:public Car,public Boat{ public: AmphibianCar(const string &name):Vehicle(name),Car(name),Boat(name){} void driveAsCar(){ cout<< name << " drive on road as car" <<'\n'; } void driveAsBoat(){ cout<< name << " drive on river as boat" <<'\n'; } // virtual void drive() override { // if (dynamic_cast<Car*>(this) == this) { // driveAsCar(); // } else { // driveAsBoat(); // } // } };
最新发布
11-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值