C ++中的抽象类,函数继承和覆盖

时间:2014-05-05 16:16:26

标签: c++ class inheritance methods

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();

2 个答案:

答案 0 :(得分:0)

我很确定它既不适用于A也不适用于B.

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

答案 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 - 成员函数以满足子类的需要。在这里,如果未在您孩子的类定义中定义纯虚拟类,那么 - 我相信 - 您实际上会遇到编译时错误。