写错是不对的:
class A {
public:
virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)
对于抽象基类?
至少在MSVC中编译......它会在运行时崩溃吗?
我理解虚拟析构函数的必要性.但为什么我们需要纯虚拟析构函数?在其中一篇C++文章中,作者提到我们在创建类抽象时使用纯虚析构函数.
但是我们可以通过将任何成员函数设置为纯虚拟来使类抽象化.
所以我的问题是
我们什么时候才能真正使析构函数变为虚拟?任何人都能给出一个很好的实时例子吗?
当我们创建抽象类时,将析构函数设置为纯虚拟是一种很好的做法吗?如果是..那为什么?
在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)
我不明白为什么析构函数被声明为纯虚拟然后实现; 我不明白为什么这应该更快的评论.
当编译器具有纯析构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
我知道纯虚函数有一个实现是可以的.但是,为什么会这样呢?这两个概念是否存在冲突?有什么用?任何人都可以提供任何例子吗?
这一页检查并给出了如何动态加载和使用类的非常清晰的示例,但有一些我很难理解的内容:
我明白为什么需要“创建”功能,但为什么需要“销毁”功能?为什么没有将接口析构函数声明为纯虚拟函数?
我做了一个相同的例子,除了:
~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并且以后不关心它的生命周期,使用“销毁”函数会很棘手,因此我需要知道是否有必要。
这段代码出了什么问题?
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 @@ …