析构函数可以调用虚函数,构造函数为什么不可以调用虚函数
程序员文章站
2024-03-21 10:52:34
...
简要结论:
1. 从语法上讲,调用完全没有问题。
2. 但是从效果上看,往往不能达到需要的目的。
Effective 的解释是:
派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。
同样,进入基类析构函数时,对象也是基类类型。
所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果,所以放在构造函数中是没有意义的,而且往往不能达到本来想要的效果。
- 在构造函数中调用
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
Fuction();
}
virtual void Fuction()
{
cout << "Base::Fuction" << endl;
}
};
class A : public Base
{
public:
A()
{
Fuction();
}
virtual void Fuction()
{
cout << "A::Fuction" << endl;
}
};
// 这样定义一个A的对象,会输出什么?
int main()
{
A a;
}
输出:
Base::Fuction
A::Fuction
- 在析构函数中调用:
#include <iostream>
using namespace std;
class A{
public:
virtual void show(){
cout<<"in A"<<endl;
}
virtual ~A(){show();}
};
class B:public A{
public:
void show(){
cout<<"in B"<<endl;
}
};
int main(){
A a;
B b;
}
输出:
in A
in A
上一篇: timescaledb 几个方便的api
下一篇: 查看pg数据库的表名字段详细描述信息语句