c ++覆盖基类的函数

时间:2016-01-26 15:34:50

标签: c++

我是C ++中面向对象编程的新手,我无法找到解决以下问题的方法,我希望这是可能的。

我有3个课程:BaseChildChild2

所有人都获得了talk();函数。

我想将BaseChildChild2个对象存储在一个数组中,然后遍历它们并执行它们的talk()函数。

这就是我希望他们打印的内容:

- Base: "base"
- Child: "child"
- Child2: "child2"

以下是我的课程:

class Base {
public:
    virtual void talk() {
        printf("base\n");
    }
}

class Child : public Base {
public:
    using Base:draw;
    void talk() {
        printf("child\n");
    }
}

class Child2 : public Base {
public:
    using Base:draw;
    void talk() {
        printf("child2\n");
    }
}

这是我的数组:

Base objects[3];
objects[0] = Base();
objects[1] = Child();
objects[2] = Child2();

for(int i = 0; i < 3; i++) {
    objects[i]->talk();
}

输出应为:

base
child
child2

3 个答案:

答案 0 :(得分:3)

您的代码切片对象。将基类的变量赋值为派生类的值时,最终会得到一个基础对象。此时,原始派生类没有任何内容,只有基类。

在C ++中,处理对象多态的方式 - 即保留原始类型的信息 - 是使用引用或指针。但是,您无法将引用放入数组中。

这意味着,您需要一个指针数组 - 但不是原始指针。你想要所谓的智能指针。总而言之,这就是您的代码的样子:

std::unique_ptr<Base> objects[3] = {new Base(), new Child(), new Child2()};

for(int i = 0; i < 3; i++) {
    objects[i]->talk();
}

答案 1 :(得分:-1)

也许是这样的?

#include <iostream>
#include <cstdio>

class Base 
{
  public:
    virtual void talk() 
    {
      printf("base\n");
    }
};

class Child : public Base 
{
  public:
    void talk() 
    {
      printf("child\n");
    }
};

class Child2 : public Base 
{
  public:
    void talk()
    {
      printf("child2\n");
    }
};

int main()
{
  Base** objects;
  objects = new Base * [3];

  objects[0] = new Base();
  objects[1] = new Child();
  objects[2] = new Child2();

  for(int i = 0; i < 3; i++) 
    objects[i]->talk();
}

输出是:

base
child
child2

答案 2 :(得分:-1)

类似于:

#include <stdio.h>

class Base {
public:
    virtual void talk() {
        printf("base\n");
    }
};

class Child : public Base {
public:
    void talk()
    {
        printf("child\n");
    }
};

class Child2 : public Base {
public:
    void talk()
    {
        printf("child2\n");
    }
};

int main()
{
    Base* objects[3];
    objects[0] = new Base();
    objects[1] = new Child();
    objects[2] = new Child2();

    for(int i = 0; i < 3; i++) {
        objects[i]->talk();
    }
}