class XA
{
public:
virtual void f(int a = 1) = 0;
};
class XB : public XA
{
public:
virtual void f(int a = 2) { std::cout << a << std::endl; }
};
XA* p = new XB;
p->f(); // 这里的输出为1
delete p;
2,父类的析构函数不为virtual的问题:
class A
{
public:
//A() { std::cout << "Create A" << std::endl;}
//~A() { std::cout << "Destroy A" << std::endl; }
virtual void f() = 0;
};
class B : public A
{
public:
B() { std::cout << "Create B" << std::endl; }
~B() { std::cout << "Destroy B" << std::endl; }
virtual void f() {}
};
std::cout << "create b1" << std::endl;
A* b1 = new B;
std::cout << "create b2" << std::endl;
B* b2 = new B;
std::cout << "delete b1" << std::endl;
delete b1; // According to the C++ standard,
// the behaviour of this is undefined.
// Usually, only ~A() is called though b1 is an instance
// of class B because ~A() is not declared virtual.
std::cout << "delete b2" << std::endl;
delete b2; // Calls destructors ~B() and ~A()
输出如下:
create b1
Create B
create b2
Create B
delete b1 // 注意这里!
delete b2
Destroy B
3,父类的析构函数为virtual时:
class A
{
public:
//A() { std::cout << "Create A" << std::endl;}
virtual ~A() { std::cout << "Destroy A" << std::endl; }
virtual void f() = 0;
};
class B : public A
{
public:
B() { std::cout << "Create B" << std::endl; }
~B() { std::cout << "Destroy B" << std::endl; }
virtual void f() {}
};
输出如下:
create b1
Create B
create b2
Create B
delete b1
Destroy B
Destroy A
delete b2
Destroy B
Destroy A
4,默认构造函数时类对象的初始化
class CA
{
public:
int _i;
// 默认构造函数
};
CA* a1 = new CA; // a1是未初始化的
std::cout << "i1: " << a1->_i << std::endl;
CA* a2 = new CA(); // a2是初始化过的
std::cout << "i2: " << a2->_i << std::endl;
CA a3; // a3是未初始化的
std::cout << "i3: " << a3._i << std::endl;
//CA a4(); // error
//std::cout << "i: " << a4._i << std::endl;
delete a1;
delete a2;
输出如下:
i1: -842150451
i2: 0
i3: -858993460
5,自己提供构造函数时类对象的初始化
class CB
{
public:
int _i;
CB() // 自己提供无参构造函数
{
std::cout << "CB()" << std::endl;
_i = 100;
}
};
CB* b1 = new CB; // b1是未初始化的
std::cout << "i1: " << b1->_i << std::endl;
CB* b2 = new CB(); // b2是初始化过的
std::cout << "i2: " << b2->_i << std::endl;
CB b3; // b3是未初始化的
std::cout << "i3: " << b3._i << std::endl;
//CB b4(); // error
//std::cout << "i: " << b4._i << std::endl;
delete b1;
delete b2;
输出如下:
CB()
i1: 100
CB()
i2: 100
CB()
i3: 100
6,自己提供有参构造函数时类对象的初始化
class CC
{
public:
int _i;
CC(int i) // 自己提供构造函数,但没有提供无参的构造函数
{
std::cout << "CC(int i)" << std::endl;
_i = i;
}
};
//CC* c1 = new CC; // error,找不到默认(系统提供)或者无参的构造函数
//std::cout << "i1: " << c1->_i << std::endl;
//CC* c2 = new CC(); // error,找不到默认(系统提供)或者无参的构造函数
//std::cout << "i2: " << c2->_i << std::endl;
//CC c3; // error,找不到默认(系统提供)或者无参的构造函数
//std::cout << "i3: " << c3._i << std::endl;
//CC c4(); // error
//std::cout << "i: " << c4._i << std::endl;
CC* c5 = new CC(100); //
std::cout << "i: " << c5->_i << std::endl;
CC c6(100); //
std::cout << "i: " << c6._i << std::endl;
//delete c1;
//delete c2;
delete c5;
输出如下:
CC(int i)
i: 100
CC(int i)
i: 100