C++ C+中的抽象类、函数继承和重写+;

C++ C+中的抽象类、函数继承和重写+;,c++,class,inheritance,methods,C++,Class,Inheritance,Methods,类是抽象类。我想从不同的子类调用相同的方法。编译器没有错误,但程序崩溃 class A { protected: MA* array1[10]; //static array of pointers to some other class int st; public: ... virtual string ToString() const { stringstream ss;

类是抽象类。我想从不同的子类调用相同的方法。编译器没有错误,但程序崩溃

class A
{
    protected:

        MA* array1[10]; //static array of pointers to some other class
        int st;

    public:
    ...
        virtual string ToString() const
        {
            stringstream ss;

            for(int i=0;i<st;i++)
            {
                ss<<array1[i]->getname()<<",";
            }

            return ss.str();
        }
};
这主要是:

A* P[5];
P[0]=new B();
P[1]=new C();
P[0]->ToString();
P[1]->ToString();

我很确定它在A和B中都不起作用

唯一的原因似乎是未定义的行为

  • 我预期的问题是一个违反三条规则的规则(不可复制?)

  • 或者,是否正确初始化
    array1
    st
    ?否则将导致数组中的值不确定,从而再次出现未定义的行为

    • 问题是:

      首先,您的派生类(B和C)继承了类A的公共成员函数(我知道这在代码中是显而易见的,但是,我们必须从某个地方开始);但是,派生类通过使用相同的函数标识符重写父类(类A)的成员函数。这里的问题是,父类不希望继承派生类重写父类,而父类正是这样做的。父类只希望派生类继承;因此,当您调用类B和类C的函数时,会发生一些奇怪的事情

      由此产生了两个问题:第一(1),我们在上面讨论的问题(见下面的代码);第二(2),派生类无权访问父类的成员函数定义,除非通过父类的对象调用(如果函数声明正确,通常情况下不会是这种情况)

      那么,你能做什么?在父声明和子声明中使用override关键字

      例如:

      Class A
      {
          private:
          ....
          public:
          virtual returntype functionIndentifier(parameters) override;
      };
      
      现在,这与继承有关;但是,在C++中,如果你的类实际上是抽象的,那么你需要使用一个<强>纯虚函数(通过设置等于0的函数),而不是在抽象类中定义函数,而忽略<强>超驰< /St>关键字,并确保每个子类实现并定义函数。p>
      Class A
      {
          private:
          ....
          public:
          virtual returntype functionIndentifier(parameters) = 0;
      };
      

      纯虚拟函数强制子类根据子类的需要继承和实现-定义-成员函数。在这里,如果您的孩子的类定义中没有定义纯虚拟类,那么-我相信-您实际上会遇到编译时错误

      st
      从未在此代码中初始化。。。你在哪里初始化它
      ToString
      不可能工作,除非它的值小于10。(如果它不是零,您在哪里初始化数组1?)
      Class A
      {
          private:
          ....
          public:
          virtual returntype functionIndentifier(parameters) = 0;
      };