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;
}