相关疑难解决方法(0)

C++中的纯虚析构造函数

写错是不对的:

class A {
public:
    virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)

对于抽象基类?

至少在MSVC中编译......它会在运行时崩溃吗?

c++ polymorphism destructor pure-virtual

158
推荐指数
2
解决办法
7万
查看次数

为什么我们需要在C++中使用纯虚拟析构函数?

我理解虚拟析构函数的必要性.但为什么我们需要纯虚拟析构函数?在其中一篇C++文章中,作者提到我们在创建类抽象时使用纯虚析构函数.

但是我们可以通过将任何成员函数设置为纯虚拟来使类抽象化.

所以我的问题是

  1. 我们什么时候才能真正使析构函数变为虚拟?任何人都能给出一个很好的实时例子吗?

  2. 当我们创建抽象类时,将析构函数设置为纯虚拟是一种很好的做法吗?如果是..那为什么?

c++ destructor pure-virtual

151
推荐指数
6
解决办法
8万
查看次数

在什么情况下提供纯虚函数的实现是有利的?

在C++中,给出纯虚函数的实现是合法的:

class C
{
public:
  virtual int f() = 0;
};

int C::f() 
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

你为什么要这样做?

相关问题:C++ faq lite包含一个例子:

class Funct {
public:
  virtual int doit(int x) = 0;
  virtual ~Funct() = 0;
};

inline Funct::~Funct() { }  // defined even though it's pure virtual; it's faster this way; trust me
Run Code Online (Sandbox Code Playgroud)

我不明白为什么析构函数被声明为纯虚拟然后实现; 我不明白为什么这应该更快的评论.

c++ performance pure-virtual

28
推荐指数
1
解决办法
2031
查看次数

纯虚拟析构函数的目的是什么?

可能的重复:
在什么情况下提供纯虚函数的实现是有利的?
为什么我们需要在C++中使用纯虚拟析构函数?

当编译器具有纯析构Child class函数时,编译器不强制实现析构函数.Basevirtual

struct Base
{
  virtual void foo () = 0;
  virtual ~Base() = 0;
};
Base::~Base() {} // necessary

struct Child : Base
{
  void foo() {}
  //ok! no destructor needed to create objects of 'Child'
};
Run Code Online (Sandbox Code Playgroud)

有趣的是那个; 编译器而不是强制Base定义析构函数体.这是理解的.(演示供参考)

那么在课堂上拥有纯粹的析构函数目的是什么?(它只是禁止创建对象吗?)virtualBaseBase

c++ destructor pure-virtual language-lawyer

19
推荐指数
2
解决办法
3069
查看次数

如果我在C++中为纯虚函数提供实现,有什么用处

我知道纯虚函数有一个实现是可以的.但是,为什么会这样呢?这两个概念是否存在冲突?有什么用?任何人都可以提供任何例子吗?

c++

8
推荐指数
2
解决办法
303
查看次数

C++ 动态加载类:为什么需要“销毁”函数?

这一页检查并给出了如何动态加载和使用类的非常清晰的示例,但有一些我很难理解的内容:

我明白为什么需要“创建”功能,但为什么需要“销毁”功能?为什么没有将接口析构函数声明为纯虚拟函数?

我做了一个相同的例子,除了:

~polygon() = 0;
Run Code Online (Sandbox Code Playgroud)

的析构函数triangle是:

triangle::~triangle() {
    std::cout << "triangle Dtor is called" <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然后当我使用时:

delete poly;
Run Code Online (Sandbox Code Playgroud)

该消息确实显示(Linux 下的 GCC 5.4.0)。

我试图寻找其他示例,但它们都提到并使用“销毁”函数,没有使用简单的纯虚拟析构函数的示例,这使我相信我在这里遗漏了一些东西,所以..它是什么?

不想使用销毁函数的背景是我想在 a 中使用分配的对象shared_ptr并且以后不关心它的生命周期,使用“销毁”函数会很棘手,因此我需要知道是否有必要。

c++ memory-management dynamic-loading dlopen

4
推荐指数
1
解决办法
1287
查看次数

C++抽象基类模板

这段代码出了什么问题?

template <class T>
class A
{
private:
    T a;

public:
    A(): a(0) {}
    virtual ~ A() = 0;
};


template <class T>
class A;

template <class T>
class B : public A<T>
{
private :
    T b;

public:
    B() : A<T>() {}
    virtual ~B(){}


};


int _tmain(int argc, _TCHAR* argv[])
{
B <double> bb;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误LNK2019:未解析的外部符号"public:virtual __thiscall A :: ~A(void)"(?? 1?$ A @ N @@ UAE @ XZ)在函数"public:virtual __thiscall B ::〜B"中引用(void )"(?? 1?$ B @ N @@ …

c++ templates abstract-class

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