首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为何C++ 这样不可以初始化基类的成员

2012-09-05 
为什么C++ 这样不可以初始化基类的成员?class Bae{public:Base(vectorint vec){m_vec vec}vectorint

为什么C++ 这样不可以初始化基类的成员?
class Bae
{
public:
Base(vector<int> vec)
{
  m_vec = vec;
}
vector<int> m_vec;
};
class Derived: public Base
{
 public:
Derived(vector<int> vec):Base(vec)
{

}

};
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);

Base* pbase = NULL;
Derived d(vec;)
pbase = &d; //@1 这样可以初始化 Base中的成员 或者 new Derived(vec)
pbase = &Derived(vec); //@2 这样就不可以了. ????

return 1;
}


[解决办法]
++,
临时对象取地址有意义吗? 函数返回立马就销毁了
pbase = &d; //@1 这样可以初始化 Base中的成员 或者 new Derived(vec)
这也不叫初始化Base中的成员,Base中的成员早在Derived d(vec;)的时候就初始化了。
pbase = &d;只是一个单纯的赋值,没有任何构造,初始化之类的行为。这句话是将d的地址赋值给pBase,因为子类类型可以转换为基类类型(反之不行),所以,&d是Derived* 类型的指针,转换为Base*类型的指针赋值给了pbase;
 

探讨
Derived(vec); 返回一个临时对象

[解决办法]
这是汇编代码:
pbase = &Derived(vec):先调用构造函数创建对象,并将对象的地址赋值给pbase,之后又调用析构造函数将对象删除,之后pbase指向的内存已经被系统收回了。

004122D7 mov dword ptr [ebp-170h],eax 
004122DD mov byte ptr [ebp-4],1 
pbase = &d; //@1 这样可以初始化 Base中的成员 或者 new Derived(vec)
004122E1 lea eax,[ebp-4Ch] 
004122E4 mov dword ptr [ebp-30h],eax 
pbase = &Derived(vec); //@2 这样就不可以了. ????
004122E7 sub esp,14h 
004122EA mov ecx,esp 
004122EC mov dword ptr [ebp-124h],esp 
004122F2 lea eax,[ebp-24h] 
004122F5 push eax
004122F6 call std::vector<int,std::allocator<int> >::vector<int,std::allocator<int> > (4110A0h) 
004122FB mov dword ptr [ebp-16Ch],eax 
00412301 lea ecx,[ebp-140h] 
00412307 call Derived::Derived (41164Fh) 
0041230C mov dword ptr [ebp-170h],eax 
00412312 mov ecx,dword ptr [ebp-170h] 
00412318 mov dword ptr [ebp-174h],ecx 
0041231E mov edx,dword ptr [ebp-174h] 
00412324 mov dword ptr [ebp-30h],edx 
00412327 lea ecx,[ebp-140h] 
0041232D call Derived::~Derived (41151Eh) 

return 1;
00412332 mov dword ptr [ebp-118h],1

热点排行