相关疑难解决方法(0)

在构造函数中调用虚函数

假设我有两个C++类:

class A
{
public:
  A() { fn(); }

  virtual void fn() { _n = 1; }
  int getn() { return _n; }

protected:
  int _n;
};

class B : public A
{
public:
  B() : A() {}

  virtual void fn() { _n = 2; }
};
Run Code Online (Sandbox Code Playgroud)

如果我写下面的代码:

int main()
{
  B b;
  int n = b.getn();
}
Run Code Online (Sandbox Code Playgroud)

人们可能期望将n其设置为2.

事实证明,n设置为1.为什么?

c++ constructor overriding virtual-functions

220
推荐指数
6
解决办法
9万
查看次数

为什么在析构函数中将虚拟表设置回该级别?

遵循这个问题 - 在大多数派生类的析构函数中进行纯虚拟调用 - 我尝试了一些代码来检查一些语法,并发现当调用过多的析构函数时,它们会调用它们相关的虚函数.考虑以下代码:

class Base
{
public:
virtual void Method() = 0;
};

class Derived :  public Base
{
public:
~Derived()
{
    Method();
}

virtual void Method()
{
    cout << "D";
}
};

class DoubleD : public Derived
{
public:

~DoubleD()
{
    Method();
}

virtual void Method()
{
    cout << "DD";
}
};

int main(array<System::String ^> ^args)
{
    DoubleD D;
    DoubleD E;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,当对象被破坏时,它会调用正确的方法(例如,首先是派生的最多,然后是派生的第二个).

输出:DD D.

我的问题是,为什么这有效?由于您不打算在c'tor/d'tor中调用虚函数,为什么虚拟表会正确"展开".

例如,我可以看到为什么导出最多的一个工作,这是虚拟函数指针表在启动时所处的状态.但是,为什么,当Derived调用析构函数时,表是否正确设置为指向该类的实现Method.

为什么不离开它,或者如果它很好,将值设置为NULL.

c++ virtual-functions

2
推荐指数
1
解决办法
1767
查看次数

标签 统计

c++ ×2

virtual-functions ×2

constructor ×1

overriding ×1