【问题标题】:Accessing derived class from base class pointer with a fixed array size从具有固定数组大小的基类指针访问派生类
【发布时间】:2020-07-23 20:21:16
【问题描述】:

我正在尝试编写一个函数parkVehicle(),该函数必须通过基类指针访问派生类的读取成员函数。如何访问它?

class Parking {
     const int MAX_SPOTS_NO = 100;
    Base B[MAX_SPOTS_NO];
    void parkVehicle() const;

}


class Base : public Read {
    std::istream& read(std::istream& istr = std::cin);
}

class derived : public Base {
    std::istream& read(std::istream& istr = std::cin);
}


class Read{
virtual std::istream& read(std::istream& istr = std::cin) = 0; 
}



void parkVehicle() {
    //call read from the derived class
}

【问题讨论】:

  • 至少有两个基本的 C++ 原因导致您不能这样做。 C++ 对象根本无法以这种方式工作。您需要实现虚拟继承,并且您需要对对象切片做一些事情。 C++ 不是 Java。有关详细信息,请参阅 C++ 教科书。
  • 如果您认为需要通过基类指针访问派生类成员,那么您的设计很可能存在缺陷。后退几步,重新考虑你的方法。 (可能,您希望在基类中使用虚函数,但请检查您的方法以确保抽象级别有意义。)

标签: c++ c++11 pointers derived-class base-class


【解决方案1】:

根据 cmets 的建议,您的课程设计需要修改。但是,只是为了回答您的查询,您可以像这样修改 - 变量 MAX_SPOTS_NO 需要声明为静态,并且成员变量 B 可以声明为指针数组(更喜欢使用智能指针)以避免循环冗余问题

class Base; // forward declaration

class Parking {
public:
    static const int MAX_SPOTS_NO = 100;
    Base* B[MAX_SPOTS_NO];
    void parkVehicle() ;

};

void Parking::parkVehicle() {
    //call read from the derived class
    B[0] = new Base();
    B[0]->read();
}

【讨论】:

    【解决方案2】:

    您的数组是slicing the objects,因此数组中没有derived 对象,只有Base 对象。多态性仅在通过指针或引用访问对象时有效,因此您需要更改数组以保存 Base* 指针:

    class Parking {
        static const int MAX_SPOTS_NO = 100;
        Base* B[MAX_SPOTS_NO];
        void parkVehicle() const;
    };
    
    void parkVehicle() {
        //call read from the derived class
        ...
        B[index]->read();
        ...
    }
    

    然后你可以根据需要将derived对象存储在数组中,例如1:

    derived *d = new derived;
    B[index] = d;
    

    或者:

    derived d;
    B[index] = &d;
    

    1:您没有提供足够的代码来准确地告诉您应该如何最好地创建、管理和存储您的 derived 对象。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 2016-07-31
      • 2020-02-11
      • 1970-01-01
      • 2014-06-22
      • 2015-02-04
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多