从输出结果我们可以看出声明为visual和非visual的输出结果是不一样的,成员函数的动态重载(声明为visual的函数 指针指向的为new的类型,非visual函数 与指针申明的类型一致)
如果在main函数里面 A *m_A = new A();会报错A为一个抽象基类,不能实例化一个对象
如果去掉里面的纯虚函数就可以了
在看个例子:
class FBase
{
public:
FBase()
{
cout<<"FBase::FBase()"<<endl;
}
~FBase()
{
cout<<"FBase::~FBase()"<<endl;
}
};
class SubF:public FBase
{
public:
SubF()
{
cout<<"SubF::SubF()"<<endl;
}
~SubF()
{
cout<<"SubF::~SubF()"<<endl;
}
};
int main()
{
FBase *base = (FBase*)new SubF();
delete base;
cout<<"###############################"<<endl;
SubF *sub = (SubF*)new FBase();
delete sub;
return 0;
}
输出结果:
FBase::FBase()
SubF::SubF() //调用两次构造函数是因为new 的是子类,要先创建父类在创建子类
FBase::~FBase() //因为不是virtual 子类强制转化为父类所以调用
###############################
FBase::FBase() //创建的是父类
SubF::~SubF()
FBase::~FBase() //调用两次析构函数是因为sub是子类所以要析构两次,先析构自己在析构父类
class FBase
{
public:
FBase()
{
cout<<"FBase::FBase()"<<endl;
}
virtual ~FBase()
{
cout<<"FBase::~FBase()"<<endl;
}
};
class SubF:public FBase
{
public:
SubF()
{
cout<<"SubF::SubF()"<<endl;
}
~SubF()
{
cout<<"SubF::~SubF()"<<endl;
}
};
int main()
{
FBase *base = (FBase*)new SubF();
delete base;
cout<<"###############################"<<endl;
SubF *sub = (SubF*)new FBase();
delete sub;
return 0;
}
结果是://添加 virtual后以 new后面的类型决定
FBase::FBase()
SubF::SubF()
SubF::~SubF()
FBase::~FBase()
#########################
FBase::FBase()
FBase::~FBase()