有些C ++材料提到我们不能在ctor或dtor中调用虚函数,
(
对不起,我认为最好换成
一些C ++材料提到我们最好不要在ctor或dtor中调用虚函数,
)
但我们可能会不小心打电话给他们。有什么方法可以阻止这种情况吗?
例如:
# include < iostream >
using namespace std;
class CAT
{
public:
CAT(){ f();}
virtual void f(){cout<<"void CAT:f()"<<std::endl;}
};
class SMALLCAT :public CAT
{
public:
SMALLCAT():CAT()
{
}
void f(){cout<<"void SMALLCAT:f()"<<std::endl;}
};
int main()
{
SMALLCAT sc;
}
输出:
void CAT::f() //not we expected!!!
谢谢
答案 0 :(得分:3)
您需要将这些“C ++材料”扔到垃圾箱中。
你当然可以从构造函数或析构函数中调用虚函数。他们将完成他们的工作。您只需要了解明确指出虚拟调度机制按照对象的当前动态类型工作的语言规范,而不是其 final 预期的动态类型。对于正在构造/销毁的对象,这些类型并不相同,这些对象在尝试从构造函数/析构函数调用虚函数时经常会混淆新手。然而,从构造函数和析构函数调用虚函数是该语言的有用功能,只要您知道它们的作用以及它们在这种情况下的工作方式。你为什么要“阻止”它?
这就像说除法运算符是危险的,因为可以将某些东西除以零,并询问如何“阻止”它在程序中的使用。
答案 1 :(得分:0)
您可以在析构函数中调用虚函数。只有在某些情况下它才会起作用,并可能导致程序崩溃。避免调用它们的方法是不要调用它们。除了可能还有一些静态分析工具可以查看你的代码并警告你这样的潜在问题之外,我所知道的并不像我所知道的那样。
答案 2 :(得分:0)
你当然可以在ctor / dtor中调用虚函数。问题是你的vtable是在每个构造函数(和析构函数)中设置的,因此你的虚函数调用将调用当前正在设置的类的实现。如果这就是你想要的,很酷。但是,您可以保存自己的vtable查找并执行范围函数调用。