c ++:如何将继承的方法仅绑定到父类?

时间:2015-12-03 23:38:09

标签: c++ inheritance

我在为我的大学工作做多基础继承项目时偶然发现了这个问题。我的问题的例子和代码本身:
我设置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;
}`

1 个答案:

答案 0 :(得分:2)

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

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

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

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