我有一个类似于以下的类结构
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);
};
Run Code Online (Sandbox Code Playgroud)
我想将派生类的实例作为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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下输出.
Hello A1
Hello A1
Run Code Online (Sandbox Code Playgroud)
我期待的地方
Hello A1
Hello B1
Run Code Online (Sandbox Code Playgroud)
因为我期待的DoSomething在乙隐藏的DoSomething的一个,因为我存储一个三分球,我希望没有对象切片(并期待在调试器对象指针显示该对象尚未切片).
我已经尝试向下投射并动态地将指针转换为B,但它会切掉Bd的数据成员.
有没有办法调用B :: DoSomething而不将指针转换为Bd?如果没有,如果我有很多B的派生类(例如Bda,Bdb,Bdc等),有没有办法使用RTTI知道将哪个派生类投射到它?
Cro*_*man 25
你需要在两个类中创建DoSomething()一个virtual函数来获得你所追求的多态行为:
virtual void DoSomething(int i) { ...
Run Code Online (Sandbox Code Playgroud)
您不需要在每个子类中实现虚函数,如以下示例所示:
#include <iostream>
class A {
public:
virtual void print_me(void) {
std::cout << "I'm A" << std::endl;
}
virtual ~A() {}
};
class B : public A {
public:
virtual void print_me(void) {
std::cout << "I'm B" << std::endl;
}
};
class C : public A {
};
int main() {
A a;
B b;
C c;
A* p = &a;
p->print_me();
p = &b;
p->print_me();
p = &c;
p->print_me();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
我是A
我是B
我是A
| 归档时间: |
|
| 查看次数: |
32047 次 |
| 最近记录: |