为什么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;
[解决办法]这是汇编代码:
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