[英]Abstract class in c++
假设我上课了:
class Bad_Date
{
private:
const char* _my_msg;
public:
const char* msg() const
{
return _my_msg;
}
};
而且,我不想创建此类的任何对象,但是我真的不想在此放置任何其他对象并将其变成纯虚拟fnc。 还有什么其他方法可以使此类抽象化,或者我必须创建虚拟的fnc并将其声明为纯虚拟的? 谢谢。
如果需要基类,则可能需要虚拟析构函数 。 使它成为纯虚拟的,您就拥有了抽象类。
如果不需要虚拟析构函数(即,该类不是多态使用的),则可以使构造函数受保护 (非私有)。
添加纯虚拟析构函数。
使构造函数受保护:
class Bad_Date
{
private:
const char* _my_msg;
// Add the 2 lines below:
protected:
Bad_Date() {}
public:
const char* msg() const
{
return _my_msg;
}
};
您可以使析构函数成为纯虚拟的,并使其成为您的“虚拟函数”。 即
class Bad_Date
{
private:
const char* _my_msg;
public:
const char* msg() const { return _my_msg; }
virtual ~Bad_Date() = 0;
};
无论如何,对于打算使用多态性的任何类,使析构函数虚拟化都是一个好主意,以确保适当地清理子类实例。 但是,如果您需要Bad_Date在析构函数中执行某些工作,则当然不能使析构函数成为纯虚拟的。 保护Bad_Date
的构造函数是另一种可行的技术。 这将确保Bad_Date
只能由Bad_Date
的子类Bad_Date
。 不幸的是,这不会阻止某人创建Bad_Date
子类只是充当Bad_Date
的工厂。
除此之外,还有用于创建抽象基类的编译器特定扩展,例如MSVC具有__interface
和gcc
曾经
具有signature
。
您可以将构造函数
设为私有
保护,从而覆盖默认的构造函数:
class Bad_Date
{
protected:
Bad_Date() { }
// rest of the class definition
};
我的C ++生锈了,但仍然:
也许您只能给该类一个私有的构造函数?
在IIRC中,抽象类之所以精确是因为它们至少具有一个纯虚函数。
使析构函数成为纯虚拟的(抽象的)-但请记住也为它提供一个实现,否则您将永远无法销毁从Bad_Date
派生的对象:
class Bad_Date
{
// ...
public: // or maybe protected
virtual ~Bad_Date() = 0;
};
Bad_Date::~Bad_Date()
{
}
许多人对也定义的纯虚函数的组合感到困惑,认为这没有任何意义。 但这不仅合法,而且在某些情况下是必需的(例如纯虚拟dtor)。
您还可以使msg()
纯虚拟的,并同时提供其实现。
class Bad_Date
{
private:
const char* _my_msg;
public:
virtual const char* msg() const = 0;
};
const char* Bad_Date::msg() const {
return _my_msg;
}
您应该阅读此内容,以避免使用纯虚拟析构函数的常见陷阱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.