gpt4 book ai didi

c++ - 我可以从派生类中排除基类成员吗?

转载 作者:行者123 更新时间:2023-11-30 02:02:21 25 4
gpt4 key购买 nike

假设我有一个名为 CWindow 的类:

class CWindow
{
public:
virtual bool Create();
};

在派生类 CMyWindow 中,我想将 Create(void) 方法重载到 Create(int someParam),但是,我不希望用户能够调用 Create(void) 方法,只能调用 Create(int someParam)。这可能吗?我可以这样做吗:

class CMyWindow : public CWindow
{
private:
bool Create();
public:
virtual bool Create(int someParam);
};

这有效吗?它基本上会使 CWindow 的前公共(public)成员成为 CMyWindow 的私有(private)成员吗?

我想如果有可能从一个类中“排除”一个成员,这是最接近这样做的,因为据我所知,C++ 中没有神奇的 youcantbeamember 关键字

我最好的猜测是,不,你不能这样做。但我只是希望,因为我想避免创建一个包含除 Create() 成员之外的所有内容的基类,并派生 CWindowCMyWindow 来自 CWindowBase

最佳答案

可以实际执行此操作,并且它会按预期工作。唯一的问题是 CMyWindow 仍然是 CWindow,它允许 Create():

CMyWindow w;
w.Create(); // does not compile
static_cast<CWindow>(w).Create(); // compiles just fine

如果你不想不惜一切代价允许这样做,那么你必须使 CWindow::Create 抽象化,并可能提供当前实现(如果有的话)作为 protected 派生类可以显式调用的成员:

class CWindow
{
public:
virtual bool Create() = 0;
protected:
bool DefaultCreateImplementation();
};

class CNormalWindow : public CWindow
{
public:
bool Create() { return DefaultCreateImplementation(); }
}

class CMyWindow : public CWindow
{
private:
virtual bool Create(); // declared but not defined
// if called by accident will produce linker error
public:
virtual bool Create(int someParam);
};

关于c++ - 我可以从派生类中排除基类成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com