C++ 关于投掷物体的问题 #包括 使用名称空间std; 甲级{ 公众: A(){std::cout

C++ 关于投掷物体的问题 #包括 使用名称空间std; 甲级{ 公众: A(){std::cout,c++,C++,,因为在第一个样本中,局部变量b首先在throw行被复制,然后在catch(A ex)行被切片,而在第二个样本中,仅执行第二次复制 我想我必须在这里提到一个咒语:)那么为什么在类B的复制构造函数之前先调用A的构造函数?基构造函数总是在派生类之前被调用。这就是为什么不能调用虚拟函数(并期望派生代码运行)因为B的复制构造函数没有显式复制基,所以基是默认构造的。B(const B&a):a(a){cout@skydoor:因为B的复制ctor仍然必须构造对象的A部分,并且您在初始值设定项列表中没有任何

,因为在第一个样本中,局部变量
b
首先在
throw
行被复制,然后在
catch(A ex)
行被切片,而在第二个样本中,仅执行第二次复制


我想我必须在这里提到一个咒语:)

那么为什么在类B的复制构造函数之前先调用A的构造函数?基构造函数总是在派生类之前被调用。这就是为什么不能调用虚拟函数(并期望派生代码运行)因为B的复制构造函数没有显式复制基,所以基是默认构造的。
B(const B&a):a(a){cout@skydoor:因为B的复制ctor仍然必须构造对象的
A
部分,并且您在初始值设定项列表中没有任何内容可以让复制ctor告诉它如何构造对象的
A
部分,所以它使用了
A
的默认构造函数。
#include <iostream>
using namespace std;

class A{
public:
    A() {std::cout<<"A() ";}
    A(const A& a){cout<<"A(const A&) ";}
    ~A(){cout<<"~A() ";}

    virtual void Foo(){cout<<"A::Foo() ";}
};

class B: public A
{
public:
    B(){std::cout<<"B() ";}
    B(const B& a){cout<<"B(const B&) ";}
    ~B(){cout<<"~B() ";}

    virtual void Foo() {cout<<"B::Foo() ";}

};

int main()
{
    try{
         B b;
         throw b;                        //throw like this
    }
    catch(A ex){
        ex.Foo();
    }
    catch(B ex){
        ex.Foo();
    }
    catch(A * ex){
        ex->Foo();
    }
    catch(B * ex){
        ex->Foo();
    }

    return 0;
}
#include <iostream>
using namespace std;

class A{
public:
    A() {std::cout<<"A() ";}
    A(const A& a){cout<<"A(const A&) ";}
    ~A(){cout<<"~A() ";}

    virtual void Foo(){cout<<"A::Foo() ";}
};

class B: public A
{
public:
    B(){std::cout<<"B() ";}
    B(const B& a){cout<<"B(const B&) ";}
    ~B(){cout<<"~B() ";}

    virtual void Foo() {cout<<"B::Foo() ";}

};

int main()
{
    try{

         throw B();              //throw it this way
    }
    catch(A ex){
        ex.Foo();
    }
    catch(B ex){
        ex.Foo();
    }
    catch(A * ex){
        ex->Foo();
    }
    catch(B * ex){
        ex->Foo();
    }

    return 0;
}