gpt4 book ai didi

C++ : How to bind inherited methods only to parent classes?

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

我在为我的大学工作做多基础继承项目时偶然发现了这个问题。我的问题示例和代码本身:
我正在设置 3 个类,A、B 和 C。
B 公开继承自 A。
C 公开继承自 B。
我想在 B 中公开设置一个方法,该方法确实将指向 A 类对象的指针作为参数。但是它应该只能使用 A 类对象,既不能使用 B 也不能使用 C。
问题是 Visual Studio 2013 没有显示任何错误,只是允许 B 类对象在 C 类对象上使用我的方法,这与我想要实现的完全相反。

为什么会这样?这是否意味着在某种程度上继承会使 C 对象同时被解释为 A、B 和 C 类型?如果没有,是否有一种直接的方法来绑定(bind)一个方法,使其仅用于它继承自的类(A 和 B 对象上的 c 方法)?如果我在任何地方错了,请随时纠正我,我仍然是编程的新手。感谢您的帮助!

`

class A
{
private:
int x;
string z;
public:
void SetZ()
{
cout << "Set Z: ";
cin >> z;
}
string GetZ()
{
return this->z;
}
};

class B
:public A
{
public:
void use_base(A* k)
{
cout << "here and now, i'm using " << k->GetZ() << " however i, " << this->GetZ() << ", might want to!";
}
};

class C
:public B
{
void use_base(A* k)
{
cout << "extra";
}
};

int main()
{
A Bob;
B Mark;
Bob.SetZ();
Mark.SetZ();
C Karl;
Mark.use_base(&Karl); // doesn't show any error

return 0;
}`

最佳答案

如果 B 公开继承自 A,那么 B* 可以隐式转换为 A* 所以 a可以使用 B* 参数调用采用 A* 的函数。为防止这种情况,您可以将继承设置为 protected 或私有(private)。但是,这可能会产生其他问题。

为防止意外传递 B*,您可以声明另一个采用 B* 的重载并将其删除。此重载将赢得 B*C* 参数并导致编译错误。您还可以使用模板概括这种方法,从而避免将指针传递给从 A 派生的任何类,而无需命名所有此类类。

void use_base(A* k) { /* do something */ }
void use_base(B*) = delete;

但是,这并不能阻止某人显式地将 B*C* 转换为 A* 并调用 A* 重载。

关于C++ : How to bind inherited methods only to parent classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34078361/

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