? ? ? ?一、派生类对象
?????????派生类对象包含基类部分和派生类部分,基类部分是属于派生类对象的组成部分,是派生类继承基类的,基类部分由基类构造函数构造,但是,在派生类内外访问基类部分受基类访问控制的限制,派生类对象只能访问基类部分的共有,派生类内不能访问基类部分的私有
//基类
class Base{
private: //私有 //派生类内无法访问 //派生类对象无法访问
protected: //保护 //派生类对象无法访问
public: //共有
Base(){ }
virtual ~Base(){ }
};
//派生类
class Derived:public Base{
public:
Derived():Base(){ }
~Derived(){ }
};
? ? ? ? 一般基类的析构函数,用虚析构函数,因为当一个基类指针指向一个动态构造的派生类的对象时,在释放对象的空间时,如果基类析构函数不是虚析构,只会调用基类析构,而不会调用派生类析构,造成内存泄漏
? ? ? ? 基类的析构函数是虚析构函数,那么派生类的析构函数也是虚析构函数,即使不写virtual关键字
#include <iostream>
class Base{
public:
virtual ~Base(){ std::cout << "~Base\n"; }
};
class Derived:public Base{
public:
~Derived(){ std::cout << "~Derived\n"; }
};
class Derived1:public Derived{
public:
~Derived1(){ std::cout << "~Derived1\n"; }
};
class Derived2:public Derived1{
public:
~Derived2(){ std::cout << "~Derived2\n"; }
};
int main()
{
Base* p = new Derived2;
delete p;
return 0;
}
? ? ? ? 二、虚继承、虚基类
????????在多重继承下,一个基类可以在派生层次中出现多次,程序会通过继承层次多次继承同一基类的类,类通过虚继承指出它希望共享其虚基类的状态,在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象,共享的基类子对象称为虚基类
#include <iostream>
class Base{
public:
Base(){ }
virtual ~Base(){ }
};
//虚继承Base
class Derived1:virtual public Base{
public:
Derived1():Base() { }
};
//虚继承Base
class Derived2:virtual public Base{
public:
Derived2():Base() { }
};
//继承Derived1、Derived2
class Derived12:public Derived1,public Derived2{
public://先构造Base、再构造Derived1、再构造Derived2、最后构造Derived12
Derived12():Base(),Derived1(),Derived2() { }
};
int main()
{
Derived12 d12;
return 0;
}
????????在虚继承中,创建最底层的派生类对象,由最低层派生类的构造函数初始化虚基类
????????创建派生类对象的构造函数调用顺序:先调用虚基类构造函数,再按声明次序调用非虚基类的构造函数
UML设计图