A类是抽象类。我想从不同的子类调用相同的方法。编译器没有错误,但程序崩溃。
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();
}
};
ToString方法在A和B类中都有效,但在C类中不起作用
class B: public A
{
private:
...
public:
string ToString() const
{
return A::ToString();
}
};
class C: public A
{
private:
...
public:
string ToString() const
{
return A::ToString();
}
};
这是主要的:
A* P[5];
P[0]=new B();
P[1]=new C();
P[0]->ToString();
P[1]->ToString();
答案 0 :(得分:0)
我很确定它既不适用于A也不适用于B.
它似乎是未定义行为的唯一原因。
http://en.wikipedia.org/wiki/Undefined_behavior
我预期的问题是违反三级规则(使A不可复制?)。
或者,您是否正确初始化array1
和st
?如果不这样做,将导致数组中的值不确定,从而再次导致未定义的行为。
答案 1 :(得分:0)
问题在于:
首先,你的派生类(B和C)继承了A类的公共成员函数(我知道这很明显看代码 - 但是,我们必须从某处开始); 但是,派生类通过使用相同的函数标识符来覆盖您的Parent类(A类)成员函数。这里的问题是Parent不希望继承派生类重写它们正在做的父类。 Parent只期望派生类继承;因此,当你调用B类和C类的功能时,会发生一些奇怪的事情。
结果出现了两个问题:第一个(1),我们在上面讨论的问题(见下面的代码);第二个(2),派生类不能访问Parent类的成员函数定义,除非通过父类的对象调用(通常不是这种情况,这里,你的函数被正确声明)。
那么,你能做什么?在您的父声明和子声明中使用覆盖关键字。
例如:
Class A
{
private:
....
public:
virtual returntype functionIndentifier(parameters) override;
};
现在,这与继承有关;但是,在C ++中,你的类实际上是抽象的,你需要使用纯虚函数(通过设置函数等于0),而不是在函数中定义函数抽象类,省略覆盖关键字,并确保每个子类实现 - 并定义 - 该函数。
Class A
{
private:
....
public:
virtual returntype functionIndentifier(parameters) = 0;
};
纯虚拟函数强制子类继承和实现 - define - 成员函数以满足子类的需要。在这里,如果未在您孩子的类定义中定义纯虚拟类,那么 - 我相信 - 您实际上会遇到编译时错误。