我是C ++中面向对象编程的新手,我无法找到解决以下问题的方法,我希望这是可能的。
我有3个课程:Base
和Child
,Child2
。
所有人都获得了talk();
函数。
我想将Base
,Child
和Child2
个对象存储在一个数组中,然后遍历它们并执行它们的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
答案 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();
}
}