Phi*_*ter 57
您可以声明纯虚拟析构函数,但为其定义.该类将是抽象的,但任何继承类在默认情况下都不是抽象的.
struct Abstract
{
virtual ~Abstract() = 0;
};
Abstract::~Abstract() {}
struct Valid: public Abstract
{
// Notice you don't need to actually overide the base
// classes pure virtual method as it has a default
};
int main()
{
// Abstract a; // This line fails to compile as Abstract is abstract
Valid v; // This compiles fine.
}
Run Code Online (Sandbox Code Playgroud)
Nim*_*Nim 44
将基础的构造函数指定为protected.这确实意味着您不能直接构造它,而是强制继承.除了良好的文档之外,没有任何东西可以让开发人员从该类继承!
例:
struct Abstract {
protected:
Abstract() {}
};
struct Valid: public Abstract {
// No need to override anything.
};
int main() {
// Abstract a; // This line fails constructor is protected
Valid v; // This compiles fine.
}
Run Code Online (Sandbox Code Playgroud)
您可以将您的基类声明为实现的纯虚拟析构函数。由于析构函数始终由编译器提供,因此派生类将不是纯虚拟的,但无法直接实例化基类。无论如何,您都应该始终将析构函数声明为虚拟的,因此不会有任何开销。
class Base
{
public:
virtual ~Base() = 0;
virtual void SomeVirtualMethod();
};
inline Base::~Base()
{
}
class Derived : public Base
{
};
inline Base* createBase()
{
// return new Base; // <- This won't compile
return new Derived; // <- This does compile, Derived is not a pure virtual class !
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21278 次 |
最近记录: |