visualstudio2008-是什么让某些东西成为C++中的抽象类
visual studio 2008 - What makes something an Abstract Class in C++
可能重复:
具体类和抽象类之间有什么区别?
当我把光标放在其中一个类上时,它告诉我这是一个抽象类。现在我知道这是一个抽象类,因为这就是这个练习的内容,但我很好奇是什么让Integense的东西知道这是个抽象类。
我做了一点家庭作业,发现这可能是因为我在这节课上有两个虚拟函数,其中一个是纯虚拟函数。
纯粹的虚拟是一个致命的赠品吗?还是有其他东西可以告诉你你正在处理或查看一个抽象类?
纯虚拟是一个致命的赠品吗
在C++中,是的。由于它没有abstract
关键字或等效关键字,使类抽象的常见习惯用法是在其中声明一个纯虚拟函数(防止实例化)。*
出于同样的原因,在C++中,接口和抽象类之间没有太大区别——C++接口只是一个只包含纯虚拟函数的类。
*更新:防止类实例化的另一种方法是声明其构造函数protected
或private
。后者意味着它也不能被子类化,但前者并不阻止子类化。因此,理论上,受保护的构造函数也可以是抽象类的符号,这是强制子类化的一种方式。然而,我从未在实践中见过这种情况。我相信这是因为抽象类是为了扩展而设计的,这在实践中几乎总是意味着它具有虚拟函数。我们之所以希望它是抽象的,是因为它实现的某些部分尚不清楚,因此它将在其子类中定义。这正是纯虚拟函数的意义所在。
使类抽象的唯一原因是它是否具有一个或多个未实现的纯虚拟函数,可能是派生函数。
struct A { // abstract
virtual void f() = 0;
};
struct B : public A { // abstract
};
struct C : public B { // not abstract
void f() {}
};
注意,A还应该有一个(可能不是纯的)虚拟析构函数。
也可以实现纯虚拟功能,但这种情况非常罕见:
struct D {
virtual void f() = 0;
};
必须在类之外定义函数:
void D :: f() {}
但是这个类仍然是抽象的。
我不会说我是C++专家,但我会说你已经搞定了。纯虚拟方法的存在意味着类不能实例化,因此是抽象。如果所有方法都是纯虚拟的(即没有实现),那么它将是接口,在这种情况下,您只需要头文件。
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用