2016-02-05 46 views
-2

什么是下面的代码的结果,并请说明原因:)简单的构造函数两难困境 - 继承

class Mother 
{ 
    public: 
    Mother () { 
     cout << "r" << endl; 
    } 
    ~Mother () 
    { 
     cout << "n" << endl; 
    } 
}; 
class Daughter: public Mother 
{ 
    public: 
    Daughter () 
    { 
     cout << "a" << endl; 
    } 
    ~Daughter () 
    { 
     cout << "b" << endl; 
    } 
}; 
void foo(Mother m){ cout<< "foo" <<endl;} 
int main() 
{ 
    Daughter lea; 
    Mother* Rachel; 
    foo(lea); 
} 

我不知道为什么,但有人告诉我这将是: R,A,FOO ,n,b,n(从左到右)

为什么调用“Daughter lea”会生成r和a?由于继承? 为什么“foo”突然出现?它不应该是最后? 谢谢!

+2

为什么不运行它并找出?使用调试器,您甚至可以浏览代码并查看运行时发生的情况。 – NathanOliver

+0

@ArielNitzan补充说,在主要问题,否则你会得到更多的优惠 –

回答

1

这是你的程序执行

int main() 
{ 
    Daughter lea; // <- invokes the ctor of Daughter, but after Mother 
    Mother* Rachel; // Nothing happens --pointer 
    foo(lea);  // foo->~Mother, ~Mother called upon exit 
}     // ~Daughter->~Mother 

的流量那么,首先,在创建lea时,它会调用构造函数Daughter。由于这是自Mother衍生Mother构造函数被调用第一,随后Daughter订单在C++构造函数调用的是base->derived

第二行没有做任何事情,因为它是指针声明。

现在,这里是有趣的部分,当我们拨打foo()lea,它被转换为Mother并传递给foo。在从foo退出时,由于foo中的Mother的本地范围而调用~Mother

程序退出时,会破坏lea,该类型的类型为Daughter。破坏顺序与施工顺序相反。即derieved - >基地,因此〜女儿之后〜母亲。

这就是为什么你越来越

r 
a 
foo 
n 
b 
n 
0

你的输出预计为: -

r 
a 
foo 
n 
b 
n 

由于DaughterMother当您创建Daughter第一的构造函数的对象派生,因此Motherthe base class将被称为&然后是Daughterthe derived class。因此,您首先获得r & a

foo因为您正在调用功能foo(您必须了解)而来。 foo之后的n归功于函数foo中的m的析构函数。

最后,当lea被销毁时,Daughter的析构函数首先被调用,然后被Mother调用。这是因为析构函数以与创建它们相反的方式释放资源。因此,您再次获得b然后n