0、父类的虚函数,不管写到private或publish,子类重写该虚构函数时,都会被重写。
1、子类继承父类,子类构建是 先初始化父类,再子类,析构时,是先子类,再父类。
2、重写父类的虚函数时,多肽形式下调用,虚函数都是调用实际类类型,而普通函数调用的是看具体调用的类类型。
3、多肽构建类时,析构函数只会走到 父类的析构,但是子类没有析构,解决方法:父类析构函数改为虚析构,子类析构函数也改为虚析构。
#include <iostream>
class BaseClass
{
public:
BaseClass()
{
std::cout << "BaseClass constructor" << std::endl;
};
~BaseClass()
{
std::cout << "BaseClass destruct" << std::endl;
};
private:
virtual void disPlay()
{
std::cout << "BaseClass disPlay()" << std::endl;
}
public:
void f1(int a)
{
std::cout << "BaseClass f1():" << a << std::endl;
}
void execute()
{
disPlay();
f1(1);
}
};
class SubClass:public BaseClass
{
public:
SubClass() { std::cout << "SubClass constructor" << std::endl; };
~SubClass() { std::cout << "SubClass destruct" << std::endl; };
public:
void disPlay() override
{
std::cout << "SubClass disPlay()" << std::endl;
}
void f1(int a)
{
std::cout << "SubClass f1():" << a << std::endl;
}
void execute()
{
disPlay();
f1(1);
}
};
int main()
{
//结果
//BaseClass constructor
//BaseClass disPlay()
//BaseClass f1() :1
//BaseClass destruct
BaseClass b1;
b1.execute();
//结果
//BaseClass constructor
//SubClass constructor
//SubClass disPlay()
//SubClass f1() :1
//SubClass destruct
//BaseClass destruct
SubClass b2;
b2.execute();
//结果
//BaseClass constructor
//SubClass constructor
//SubClass disPlay()
//BaseClass f1() :1
//BaseClass destruct
BaseClass* b3 = new SubClass();
b3->execute();
delete b3;
}