Будет ли деструктор аргумента шаблона для шаблонного класса вызываться при удалении? - PullRequest
0 голосов
/ 14 мая 2010

Если у вас есть шаблонный базовый класс, как в следующем примере:

class A{
   public:
    A();
    virtual ~A();
};

template <class T>
class B : public T
{
  public:
    B();
    virtual ~B();
};

typedef B<A> C;

class D : public C
{
  public:
    D();
    virtual ~D();
};

Когда вы удаляете экземпляр D, будет ли вызываться деструктор A?

Я, вероятно, создам тестовую программу, чтобы выяснить, что происходит, но просто подумав об этом, я не был уверен, что должно произойти.

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

При удалении экземпляра D будет деструктор А называться?

Да. Здесь нет ничего особенного (за исключением того, что у вас есть личный доступ ко всему, что означает, что он, вероятно, не будет компилироваться).

2 голосов
/ 14 мая 2010

В заявке на получение ответа от двух противоречивых ответов дано:

#include <iostream>
using namespace std;

class A{
    public:
    A() {}
    virtual ~A() { cout << "~A()\n"; }
};

template <class T>
class B : public T
{
    public:
    B() {}
    virtual ~B() {}
};

typedef B<A> C;

class D : public C
{
    public:
    D() {}
    virtual ~D() {}
};

int main() {
    D d;
}

Тогда да, конечно, деструктор А будет называться.

...