让我说我上课了:
class Bad_Date
{
private:
const char* _my_msg;
public:
const char* msg() const
{
return _my_msg;
}
};
我希望无法创建此类的任何对象,但我真的不想在其中放置任何其他内容并使其成为纯虚拟fnc。有没有其他方法可以使这个类抽象或我必须创建虚拟fnc并将其声明为纯虚拟? 谢谢。
答案 0 :(得分:10)
如果您需要基类,则可能需要虚拟析构函数。让它变成纯粹的虚拟,你就得到了抽象的类。
如果您不需要虚拟析构函数(即该类未以多态方式使用),则可以使构造函数受保护(非私有)。
答案 1 :(得分:7)
添加纯虚析构函数。
答案 2 :(得分:7)
使构造函数受到保护:
class Bad_Date
{
private:
const char* _my_msg;
// Add the 2 lines below:
protected:
Bad_Date() {}
public:
const char* msg() const
{
return _my_msg;
}
};
答案 3 :(得分:3)
你可以使析构函数变为虚拟,并将其作为你的“虚函数”。即。
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
的工厂。
除此之外,还有用于创建抽象基类的编译器特定扩展,例如MSVC有__interface
,gcc 曾经有signature
。
答案 4 :(得分:1)
您可以使构造函数 private 受保护,从而覆盖默认构造函数:
class Bad_Date
{
protected:
Bad_Date() { }
// rest of the class definition
};
答案 5 :(得分:0)
我的C ++生锈了,但仍然:
也许你只能给这个类一个私有构造函数?
答案 6 :(得分:0)
使析构函数变为纯虚拟(抽象) - 但是记住也给它一个实现,否则你将永远无法破坏从Bad_Date
派生的对象:
class Bad_Date
{
// ...
public: // or maybe protected
virtual ~Bad_Date() = 0;
};
Bad_Date::~Bad_Date()
{
}
许多人对纯虚拟功能的组合感到困惑,这些功能也被定义,认为它没有意义。但这不仅是合法的,在某些情况下也是必需的(比如纯虚拟的dtor)。
答案 7 :(得分:0)
你也可以制作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;
}
答案 8 :(得分:0)
您应该阅读this以避免使用纯虚拟析构函数的常见陷阱。