在 C++ 中;
有没有办法通过基类调用派生类的函数 即使功能没有被覆盖?换句话说,我在 为了在没有提升的情况下拥有异构容器;我想调用一个成员函数 这仅特定于派生类...
例子: (我只是编写了这段代码,所以可能存在语法错误,但希望你能理解要点)
class Vehicle
{
public:
virtual void do_vehicle_stuff();
// virtual void do_car_specific_stuff(); makes no sense here
}
class Car : public Vehicle
{
public:
void do_vehicle_stuff();
void do_car_specific_stuff();
}
Car a,b;
list<Vehicle> vehicle_list;
vehicle_list.push_back(a);
vehicle_list.push_back(b);
vehicle_list.front().do_car_specific_stuff();
错误:“Class Vehicle”没有名为“do_car_specific_stuff()”的成员
最佳答案
当您将类插入列表时,您正在对它们进行切片。在
仅限 C++ 子类型多态性(您正在使用的多态性类型)
通过引用或指针而不是值工作。当你插入
您的 carS
进入 list
它们被转换为 VehicleS
。
一个例子:
Car c;
std::vector<Vehicle> vs;
vs.push_back(c); // slicing happens
vs.front(); // not a car anymore, but just a vehicle,
// the Car-ness is lost through the copy operation
怎么做:
std::vector<std::unique_ptr<Vehicle>> vs;
vs.push_back(new Car());
vs.front(); // actually a Car
在您解决了代码的根本缺陷之后,这可能 帮助你:
Vehicle* vehiclep = new Car();
if(auto carp = dynamic_cast<Car*>(vehiclep)) {
carp->do_car_specific_stuff();
}
这是一项相当昂贵的操作,通常表明 设计味道,所以你可能想重新考虑你在做什么。
关于c++ - 通过未覆盖的基类从派生类调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675785/