abstract class
抽象类
定义不能实例化但可用作基类的抽象类型。
句法
纯虚函数是虚函数谁的报关员具有以下语法:
declarator virt-specifier(optional) = 0 | | |
---|
在这里,序列= 0
称为纯说明符,并在声明器之后或可选的virt说明符%28之后立即出现。覆盖或最终29%。
纯说明符不能出现在成员函数定义中。
二次
struct Base { virtual int g( virtual ~Base() {} };
struct A : Base{
// ok, declares three member virtual functions, two of them pure
virtual int f() = 0, g() override = 0, h(
// ok, destructor can be pure too
~A() = 0;
// error: pure-specifier on a function definition
virtual int b()=0 {}
};
二次
抽象类是定义或继承至少一个函数的类。最后的骑士纯粹是虚拟的。
解释
抽象类用于表示一般概念%28(例如,Shape%29),它可以用作具体类%28(例如,循环%29)的基类。
不能创建抽象类的对象。抽象类型不能用作参数类型、函数返回类型或显式转换的类型。可以声明对抽象类的指针和引用。
二次
struct Abstract {
virtual void f() = 0; // pure virtual
}; // "Abstract" is abstract
struct Concrete : Abstract {
void f() override {}; // non-pure virtual
virtual void g( // non-pure virtual
}; // "Concrete" is non-abstract
struct Abstract2 : Concrete {
void g() override = 0; // pure virtual overrider
}; // "Abstract2" is abstract
int main()
{
// Abstract a; // Error: abstract class
Concrete b; // OK
Abstract& a = b; // OK to reference abstract base
a.f( // virtual dispatch to Concrete::f()
// Abstract2 a2; // Error: abstract class (final overrider of g() is pure)
}
二次
纯虚拟函数的定义可以提供%28,如果纯虚拟函数是破坏者%29:派生类的成员函数可以使用限定函数id调用抽象基%27s纯虚拟函数。必须在类主体%28之外提供此定义函数声明的语法允许两个纯说明符= 0
和功能体%29。
从构造函数或抽象类的析构函数中对纯虚拟函数进行虚拟调用是未定义的行为%28,无论它是否具有%29的定义。
二次
struct Abstract {
virtual void f() = 0; // pure virtual
virtual void g() {}; // non-pure virtual
~Abstract() {
g( // okay, calls Abstract::g()
// f( // undefined behavior!
Abstract::f( // okay, non-virtual call
}
};
//definition of the pure virtual function
void Abstract::f() { std::cout << "A::f()\n"; }
struct Concrete : Abstract {
void f() override {
Abstract::f( // OK: calls pure virtual function
}
void g() override {}
~Concrete() {
g( // okay, calls Concrete::g()
f( // okay, calls Concrete::f()
}
};
二次
另见
- 虚拟
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。