作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想要一个 C++ Interface
继承时必须覆盖(如果可能的话)。到目前为止,我有以下内容:
class ICommand{
public:
// Virtual constructor. Needs to take a name as parameter
//virtual ICommand(char*) =0;
// Virtual destructor, prevents memory leaks by forcing clean up on derived classes?
//virtual ~ICommand() =0;
virtual void CallMe() =0;
virtual void CallMe2() =0;
};
class MyCommand : public ICommand
{
public:
// Is this correct?
MyCommand(char* Name) { /* do stuff */ }
virtual void CallMe() {}
virtual void CallMe2() {}
};
我故意留下了我认为构造函数/析构函数应该在 ICommand
中实现的方式。 .我知道如果我删除评论,它将无法编译。请问有人:
ICommand
中声明构造函数/析构函数以及它们在 MyCommand
中的用途ICommand
中的设置是否正确?这样MyCommand
必须覆盖 CallMe
和 CallMe2
.最佳答案
C++ 不允许使用虚拟构造函数。一个简单的实现(没有虚拟构造函数)看起来像这样:
class ICommand {
public:
virtual ~ICommand() = 0;
virtual void callMe() = 0;
virtual void callMe2() = 0;
};
ICommand::~ICommand() { } // all destructors must exist
请注意,即使是纯虚析构函数 must被定义。
一个具体的实现看起来和你的例子一模一样:
class MyCommand : public ICommand {
public:
virtual void callMe() { }
virtual void callMe2() { }
};
您有几个 options对于构造函数。一种选择是禁用 ICommand
的默认构造函数,这样子类将 实现调用 ICommand 构造函数的构造函数:
#include <string>
class ICommand {
private:
const std::string name;
ICommand();
public:
ICommand(const std::string& name) : name(name) { }
virtual ~ICommand() = 0;
virtual void callMe() = 0;
virtual void callMe2() = 0;
};
ICommand::~ICommand() { } // all destructors must exist
一个具体的实现现在看起来像这样:
class MyCommand : public ICommand {
public:
MyCommand(const std::string& name) : ICommand(name) { }
virtual void callMe() { }
virtual void callMe2() { }
};
关于C++ 抽象基类构造函数/析构函数 - 一般正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513408/
我是一名优秀的程序员,十分优秀!