gpt4 book ai didi

c++ - 在 C++ 中停止或阻止继​​承

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:58 25 4
gpt4 key购买 nike

我会阻止子类重写基方法,并让子类重写父类中的新方法。换句话说,基类的子类阻塞了基类的方法并委托(delegate)给一个新的方法,进一步的子类必须重写该方法。我仍然希望基类方法可用。

这是一个例子:

#include <iostream>
#include <string>

struct Base
{
virtual const std::string& class_name(void) = 0;
};

struct Level1
: public Base
{
private: // Prevent child classes from overriding
// the Base::class_name method
const std::string& class_name(void)
{
static std::string name;
name = "class" + class_name_from_level_1();
return name;
}
protected:
// This is the "new" or redirected class that child classes
// must override.
virtual const std::string& class_name_from_level_1(void) = 0;
};

struct Level2
: public Level1
{
static std::string name;

const std::string& class_name_from_level_1(void)
{
if (name.length() == 0)
{
name = "Level2";
}
return name;
}
};


int main(void)
{
Level2 lev2;
std::cout << lev2.class_name() << "\n";
return 0;
}

我从 g++ 得到以下错误:

$ g++ hiding_virt_methods.cpp -o hiding_virt_methods.exe
hiding_virt_methods.cpp: In function `int main()':
hiding_virt_methods.cpp:15: error: `virtual const std::string& Level1::class_name()' is private
hiding_virt_methods.cpp:43: error: within this context

在上面的例子中,我想要 Level2 的执行链如下:
Base::class_name() --> Level1::class_name_from_level_1() --> Level2::class_name_from_level_1()

此外,我只想阻止继承 Base 类中的特定方法。 protected 和私有(private)继承影响所有公共(public)方法。

那么如何停止继承树中不同层级的特定Base方法的继承链呢?

编辑:现实世界的例子。
我有一个接口(interface)类 Record。类 Record_With_Id 继承自类 Record 并添加一个 ID 字段。 Record 类包含一个 accept_visitor 方法。 Record_With_Id 类重写 accept_visitor 以应用于 ID 字段,然后调用虚方法 record_with_id_accept_visitor,后代必须实现该方法。

最佳答案

对于您眼前的问题,您可以将 class_name() 函数重命名为 class_name_impl() 或类似名称,然后在基类中有一个调用实现的 class_name() 函数。这样,在派生对象上调用 class_name() 时,只有基类版本匹配。

更一般地说,您可以通过在派生类中使用同名函数来阻止调用基类方法的尝试 - 正如您所做的那样,但是任何人都可以转换为 Base& 并调用他们喜欢的任何东西。您无法阻止虚拟方法在派生类中被重写……您只能阻挠它们的使用。

值得记住的是,公共(public)派生类是基类的一个实例,并且应该提供基类的接口(interface)。

编辑:你是“真实世界的例子”编辑,你能用正常的实现来解释这个问题吗...

#include <iostream>

struct Visitor
{
virtual void operator()(int&) const = 0;
};

struct X
{
virtual void visit(Visitor& v) { v(a); v(b); }
int a;
int b;
};

struct X_with_C : X
{
int c;
virtual void visit(Visitor& v) { X::visit(v); v(c); }
};

struct My_Visitor : Visitor
{
void operator()(int& n) const { std::cout << ++n << '\n'; }
};

int main()
{
X x;
x.a = 10;
x.b = 20;
My_Visitor visitor;
x.visit(visitor);
X_with_C xc;
xc.a = -10;
xc.b = -20;
xc.c = -30;
xc.visit(visitor);
X& rx = xc;
rx.visit(visitor);
}

输出:

11
21
-9
-19
-29
-8
-18
-28

关于c++ - 在 C++ 中停止或阻止继​​承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983564/

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