如何设置代表接口的类?这只是一个抽象的基类吗?
纯虚函数和虚函数有什么区别?
我知道"纯虚函数是一个没有正文的虚函数",但这意味着什么,以及下面这一行实际完成的内容:
virtual void virtualfunctioname() = 0
Run Code Online (Sandbox Code Playgroud) 我的基本理解是没有纯虚函数的实现,但是,有人告诉我可能有纯虚函数的实现.
class A {
public:
virtual void f() = 0;
};
void A::f() {
cout<<"Test"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
代码是否正常?
使其成为具有实现的纯虚函数的目的是什么?
写错是不对的:
class A {
public:
virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)
对于抽象基类?
至少在MSVC中编译......它会在运行时崩溃吗?
我理解虚拟析构函数的必要性.但为什么我们需要纯虚拟析构函数?在其中一篇C++文章中,作者提到我们在创建类抽象时使用纯虚析构函数.
但是我们可以通过将任何成员函数设置为纯虚拟来使类抽象化.
所以我的问题是
我们什么时候才能真正使析构函数变为虚拟?任何人都能给出一个很好的实时例子吗?
当我们创建抽象类时,将析构函数设置为纯虚拟是一种很好的做法吗?如果是..那为什么?
我们总是声明一个纯虚函数:
virtual void fun () = 0 ;
Run Code Online (Sandbox Code Playgroud)
即,它总是被赋值为0.
我的理解是,这是将此函数的vtable条目初始化为NULL,此处的任何其他值都会导致编译时错误.这种理解是否正确?
我有时会注意到计算机崩溃的程序出现错误:"纯虚函数调用".
当无法创建抽象类的对象时,这些程序如何编译?
今天我正在阅读关于纯函数,与它的使用混淆:
如果函数为同一组输入返回相同的值集并且没有任何可观察的副作用,则称该函数是纯的.
例如strlen(),纯粹的功能,而不纯的功能rand().
__attribute__ ((pure)) int fun(int i)
{
return i*i;
}
int main()
{
int i=10;
printf("%d",fun(i));//outputs 100
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的行为方式与没有pure声明时相同.
将函数声明为pure[如果输出没有变化]有什么好处?
纯虚函数(当我们设置时= 0)也可以有一个函数体.
如果它们根本不被调用,那么为纯虚函数提供函数体有什么用呢?
纯虚函数是那些虚拟的成员函数,具有pure-specifier(= 0;)
C++ 03第10.4条第2款告诉我们抽象类是什么,作为旁注,以下内容:
[注意:函数声明不能同时提供纯指定符和定义-end note] [示例:
struct C {
virtual void f() = 0 { }; // ill-formed
};
Run Code Online (Sandbox Code Playgroud)
- 末端的例子]
对于那些不太熟悉这个问题的人,请注意纯虚函数可以有定义,但上面提到的条款禁止这些定义以内联方式出现(lexically in-class).(对于定义纯虚函数的用法,您可能会看到,例如,这个GotW)
现在,对于所有其他类型和类型的函数,它被允许提供类内定义,并且这种限制乍一看似乎绝对是人为的和莫名其妙的.想到这一点,它似乎在第二次和随后的一瞥:)但我相信如果没有具体原因那么限制将不存在.
我的问题是:有人知道这些具体原因吗?也欢迎良好的猜测.
笔记:
inline此问题中的单词未引用内联关键字.它应该是词汇上的词汇pure-virtual ×10
c++ ×9
destructor ×2
polymorphism ×2
c ×1
function ×1
inheritance ×1
interface ×1