从基础调用特定派生类型的特定函数

时间:2015-08-01 23:22:44

标签: c++ oop inheritance polymorphism

让我们这样说.....

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();

似乎编译得很好:/

1 个答案:

答案 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 

注意:这种多态行为仅适用于基类型的虚函数(动态绑定到真实对象的成员函数)。对于任何非虚拟函数para,将使用A函数。并且您无法调用未针对A定义的B函数。