【问题标题】:why am I able to call grandparent method with grandchild object? I read that it was not possible为什么我可以用孙对象调用祖父方法?我读到这是不可能的
【发布时间】:2021-03-20 13:09:51
【问题描述】:

这是我从网上得到的代码... 以及虚拟关键字是如何工作的? 我认为这个 virtual 关键字与这种行为有关,但我不明白它是什么。

class A {
    int x;

public:
    A(int i) { x = i; }
    void print() { cout << x; }
};

class B : virtual public A {
public:
    B()
        : A(10)
    {
    }
};

class C : virtual public A {
public:
    C()
        : A(10)
    {
    }
};

class D : public B, public C {
};

int main()
{
    D d;
    d.print();
    return 0;
}

【问题讨论】:

  • 您从哪里获取代码?你在哪里读到不能调用祖父方法?
  • 请格式化您的代码
  • 你在这里混淆了几件事。其中之一是virtual base classe
  • 你能提供这个假设的来源吗?

标签: c++ class inheritance methods virtual


【解决方案1】:

为什么我可以用孙对象调用祖父方法?

因为这就是继承的工作原理。该成员函数由子类和孙子类继承。

我读到这是不可能的

要么你读错了,要么你误解了。

虚拟关键字是如何工作的?

当一个虚拟基础在层次结构中多次出现时,这些事件将组合成一个基础子对象。

在 D 的情况下,B 的基 A 和 C 的基 A 是同一个基,如果继承不是虚拟的,情况就不是这样了。

【讨论】:

    【解决方案2】:

    你的假设可能是对的,但这并不容易。

    print 被声明为public 成员函数。由于您使用public 派生每个类,因此您仍然可以从您的D 类对象中调用print

    如果你想要你描述的行为,一种方法是,你必须重写你的类

    class A {
        int x;
    
    public:
        A(int i) { x = i; }
    
    private:
        void print() { cout << x; }
    };
    

    你应该研究“继承”这个话题。你可以从ARTICLE开始。


    一般来说,菱形类结构指向糟糕的软件设计。是的,可能有一些很好的理由来创造这样的东西。但是判断问题的类型,你真的应该忘记它并避免它。除非你真的很确定自己在做什么。

    您找到的结构描述为here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 2017-03-17
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多