【问题标题】:c++ : How to bind inherited methods only to parent classes?c ++:如何仅将继承的方法绑定到父类?
【发布时间】:2015-12-03 23:38:09
【问题描述】:

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

为什么会这样? 这是否意味着继承在某种程度上会使 C 对象同时被解释为 A、B 和 C 类型?如果没有,是否有直接的方法来绑定仅用于它继承自的类的方法(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;
}`

【问题讨论】:

  • “这是否意味着在某种程度上继承会使 C 对象被解释为 A 类型...”公共继承模型是一个 is-a 关系,因此是的,class C : public B 意味着:任何 C 都是B(以及任何BA,当需要A 时也允许任何C)。

标签: c++ inheritance


【解决方案1】:

如果B 公开继承自A,则B* 可以隐式转换为A*,因此可以使用B* 参数调用采用A* 的函数。为了防止这种情况,您可以使继承受保护或私有。但是,这可能会产生其他问题。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2014-06-21
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多