c++ - 通过未覆盖的基类从派生类调用函数

标签 c++ inheritance

在 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/

相关文章:

c++ - 为什么应该调用派生类方法时调用基类方法

c++ - Client Server场景下复杂且相互关联的数据结构

c++ - 如何将 int 附加到 tchar?

c++ - 更有效地遍历原始视频

c++ - 在 C++ 中,是在堆栈或堆上的函数中创建 vector 还是映射?

python - SQLAlchemy 继承

java - 继承和重载构造函数

c++ - 无法访问 protected 成员

c++ - 虚函数——指针在哪里?

c++ - C++ 中的模板断言?