class Base
{
public:
Base() { Foo(); }
virtual ~Base(){}
virtual void Foo()
{
std::cout << 1 << std::endl;
}
};
class Derive : public Base
{
public:
Derive(int v) :val_(v) {}
~Derive() { }
virtual void Foo()
{
std::cout << val_<< std::endl;
}
private:
int val_ ;
};
这样产生的问题就是:输出是1,因为在子类的构造函数中,调用的基类的构造函数,这个时候,其实子类都没有构造好
但是如果是写成了下面这个样子:
class Base
{
public:
Base() { } ///< 鎵撳嵃 1
void Foo1(){ Foo() ; }
virtual void Foo()
{
std::cout << 1 << std::endl;
}
virtual ~Base(){}
};
class Derive : public Base
{
public:
Derive(int v) :val_(v) {}
int val_ ;
~Derive() { }
virtual void Foo()
{
std::cout << val_<< std::endl;
}
private:
};
这个时候输出就是2了;
我想说,原来的书里面的那种方案是不能够得出我们想要的异常结果的。猜测原因是构造函数里面的代码被调用的时机是在,所有的虚表都已经初始化完毕后才会对他进行调用