让我们这样说.....
struct A {virtual void something(){cout <<"I'm A.";}};
struct B, A
{
void something(){cout << "I'm B.";}
void somethingFromB(){cout << "I'm from B.";}
}
int main()
{
A a = B();
//Now, here is where I want to call "somethingFromB" from A. How to?
}
因此,如此处所示,我们可以从类型为“A”的对象调用“某事”,就像类型为“B”的对象一样。我现在创建了一个名为a的类型为“A”的对象,并将其设为“B”。如何使用它就像它是一个普通的B对象,并能够从它调用“somethingFromB”?
EDIT --- 我认为我可以使用:
A* a = new B(); ((B*)a)->somethingFromB();
似乎编译得很好:/
答案 0 :(得分:1)
问题是如果你定义一个A对象,它将仍然是一个A对象。
如果将派生对象复制到其中,则会执行隐式转换。实际上,A
内的B
子对象将被复制。此效果称为slicing
您也可以定义自己的构造函数或赋值运算符,以便从A中生成A.但无论您如何控制此副本,最终目标对象仍为A.
这就是A a = B();
真正创建A并表现为A的原因。
如果你想使用多态并保持你的类型,你可以使用指针或引用:
A& ra = b; // reference to an A object
ra.something(); // ==> it's a B because ra refers to the original object
A* pa = &b; // pointer to an A object
pa->something(); // ==> it's a B because pa points to the original object
shared_ptr<B> spb = make_shared<B>(); // creates a shared pointer to a newly allocated B object
shared_ptr<A> spa = spb;
spa->something(); // ==> it's a B again
注意:这种多态行为仅适用于基类型的虚函数(动态绑定到真实对象的成员函数)。对于任何非虚拟函数pa
和ra
,将使用A
函数。并且您无法调用未针对A定义的B函数。