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;
};