我正在研究C++库。这个库将包含一堆简单的对象,所有对象都非常相似。用派生类的数据调用基类的方法:有没有一种优雅的方式来做到这一点?
我已经定义了一个简单的界面,我的对象:
struct ICommand_v1
{
virtual void GetCommandName(wchar_t* nameBuffer, size_t* nameBufferSize) = 0;
virtual void GetCommandGUID(wchar_t* guidBuffer, size_t* guidBufferSize) = 0;
virtual bool Execute(int argc, wchar_t* argv[]) = 0;
};
我这里的难度在于在GetCommandName
和GetCommandGUID
功能。他们应该对每个小类几乎相同;有一些理智的检查,然后返回命令的内置名称或GUID。从一个GetCommandName
到另一个,或一个GetCommandGUID
到另一个的唯一区别是返回的值。我宁愿不重复跨越两打这些方法或对象,所以我的图书馆将与工作,所以我试图使一个基类,我的对象:
struct ICommandImplementation_v1: ICommand_v1
{
public:
virtual void GetCommandName(wchar_t* nameBuffer, size_t* nameBufferSize)
{
size_t workingBufferSize = *nameBufferSize;
if ((nameBuffer == nullptr) || (wcslen(commandName) > workingBufferSize))
{
*nameBufferSize = wcslen(commandName);
return;
}
wcsncpy(nameBuffer, commandName, workingBufferSize);
*nameBufferSize = wcslen(commandName);
}
virtual void GetCommandGUID(wchar_t* guidBuffer, size_t* guidBufferSize)
{
size_t workingBufferSize = *guidBufferSize;
if ((guidBuffer == nullptr) || (wcslen(commandGUID) > workingBufferSize))
{
*guidBufferSize = wcslen(commandGUID);
return;
}
wcsncpy(guidBuffer, commandGUID, workingBufferSize);
*guidBufferSize = wcslen(commandGUID);
}
virtual bool Execute(int argc, wchar_t* argv[])
{
return true;
}
private:
const wchar_t* commandName = TEXT("Default");
const wchar_t* commandGUID = TEXT("Default");
};
于是,我试图让我的对象覆盖基类的commandName
和commandGUID
属性:
struct AboutCommand: ICommandImplementation_v1
{
public:
bool Execute(int UNUSED(argc), wchar_t* UNUSED(argv[]))
{
return true;
}
private:
const wchar_t* commandName = TEXT("AboutCommand");
const wchar_t* commandGUID = TEXT("01eba0e6-81b9-4fa7-a9f3-407d330da9b3");
};
当然,这实际上并没有正常工作。创建一个AboutCommand
对象并调用它的GetCommandName
返回“Default”。这是有道理的 - 我们实际上调用ICommandImplementation_v1
的GetCommandName
,而ICommandImplementation_v1
不知道AboutCommand
或其阴影commandName
。
在这一点上,我想我可能得内ICommandImplementation_v1
,需要一个命令名称,以及一个缓冲区/缓冲区大小(ICommandImplementation_v1::GetRealCommandName(const wchar_t* commandName = TEXT("Default"), wchar_t* nameBuffer, size_t* nameBufferSize)
,然后AboutCommand
的GetCommandName
只需调用创建一个简单的方法保护。拥有自己的commandName
这个功能这似乎笨拙对我来说,虽然,有没有更清洁,更优雅的方式来做到这一点
难道你不能声明那些保护而不是私人的字段吗?这应该让你“覆盖”他们 – BlackBear
@BlackBear我只是试图改变数据成员以'ICommandImplementation_v1'和'AboutCommand'保护,但我仍然遇到同样的问题。 – computerfreaker