【发布时间】:2013-09-23 23:30:50
【问题描述】:
我有一个类似于下面的类结构
class A
{
public:
A(void);
~A(void);
void DoSomething(int i)
{
std::cout << "Hello A" << i << std::endl;
}
};
class B : public A
{
public:
B(void);
~B(void);
void DoSomething(int i)
{
std::cout << "Hello B" << i << std::endl;
}
};
class Ad : public A
{
public:
Ad(void);
~Ad(void);
};
class Bd : public B
{
public:
Bd(void);
~Bd(void);
};
我想将派生类的实例作为 A* 的集合存储在容器(标准映射)中,然后遍历容器并为每个实例调用方法。
#include "A.h"
#include "B.h"
#include "Ad.h"
#include "Bd.h"
#include <map>
int main(int argc, char** argv)
{
std::map<int,A*> objectmap;
objectmap[1] = new Ad();
objectmap[2] = new Bd();
for (std::map<int,A*>::iterator itrobject = objectmap.begin();
itrobject!=objectmap.end(); itrobject++)
{
itrobject->second->DoSomething(1);
}
return 0;
}
以上代码产生以下输出。
Hello A1
Hello A1
我期待的地方
Hello A1
Hello B1
因为我希望 B 中的 DoSomething 隐藏 A 中的 DoSomething,并且因为我正在存储 A 指针,我希望没有对象切片(并且在调试器中查看对象指针表明该对象尚未被切片)。
我尝试过向下转换和动态转换指向 B 的指针,但它会切掉 Bd 的数据成员。
有什么方法可以调用 B::DoSomething 而无需将指针转换为 Bd?如果没有,如果我有许多 B 派生类(例如 Bda、Bdb、Bdc 等),有什么方法可以使用 RTTI 来知道将其转换为哪个派生类?
【问题讨论】:
-
你需要使那个函数
virtual。 -
@PaulGriffiths 你应该让你的评论成为答案。
-
如果我将 A::DoSomething 设为虚拟,那么我需要在 Ad 中实现 DoSomething,对吗?
-
@helloworld922:好电话,已添加。
-
我有点不明白为什么人们会竭尽全力输入这样一个详细的问题,只是为了提交与之前迭代完全相同的标题。他们害怕搜索吗? stackoverflow.com/questions/15853031/…
标签: c++ inheritance