C ++继承,在子类中没有替换函数

时间:2013-11-28 00:03:30

标签: c++ inheritance

我在C ++中有继承问题。附加的代码生成输出“1,1”,但我认为类bc中的操作方法替换了类a中的操作方法。所以我期望输出“ 2,3,”。我需要更改什么才能获得输出“ 2,3,”?

#include <iostream>

//Class a

class a
{
public:
    a();
    int action();
};

a::a()
{
}

int a::action()
{
    return 1;
}

//Class b

class b : public a
{
public:
    b();
    int action();
};

b::b()
{
}

int b::action()
{
    return 2;
}

//Class c

class c : public a
{
public:
    c();
    int action();
};

c::c()
{
}

int c::action()
{
    return 3;
}

//Main Programm

int main()
{
    a arr[2];
    arr[0] = b();
    arr[1] = c();

    for(int i = 0; i<2; i++)
    {
        std::cout << arr[0].action() << ",";
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

动作需要在基类中是虚拟的,否则你无法覆盖它。

您可以使用foo() override表示法来检查是否真的覆盖了某些内容。

您必须通过指向基类型的指针访问派生类型,否则您将切片并执行其他令人讨厌的事情。另外,有时候让析构函数变为虚拟也是个好主意。

class Base { };
class Derived : public Base { };

some_container<Base*> baseOrDerived;  

然后,您可以将Base和Derived对象分配到此容器中。例如,使用new,您可能希望使用std::shared_ptr<Base> or std::unique_ptr<Base>代替Base*

答案 1 :(得分:1)

你可以用虚函数得到输出“2,3”:
首先,您应该在课程a中change void action();virtual void action();; 第二,你应该使用指针来实现多态;
第三,您应该将arr[0]更改为arr[i];

这是我的代码:

#include <iostream>

//Class a

class a
{
public:
    a();
    virtual int action();
};

a::a()
{
}

int a::action()
{
    return 1;
}

//Class b

class b : public a
{
public:
    b();
    int action();
};

b::b()
{
}

int b::action()
{
    return 2;
}

//Class c

class c : public a
{
public:
    c();
    int action();
};

c::c()
{
}

int c::action()
{
    return 3;
}

int main(int argc, char *argv[])
{
    a *(arr[2]);
    arr[0] = new b();
    arr[1] = new c();

    for(int i = 0; i<2; i++)
    {
        std::cout << arr[i]->action() << ",";
    }

    return 0;
}

这是我的输出:
enter image description here