C++ 为什么我可以用孙子对象调用祖父母方法?我读到这是不可能的

C++ 为什么我可以用孙子对象调用祖父母方法?我读到这是不可能的,c++,class,inheritance,methods,virtual,C++,Class,Inheritance,Methods,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 pub

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

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;
}
A类{
int x;
公众:
A(inti){x=i;}
无效打印(){cout
为什么我可以用孙子对象调用祖父母方法

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

我读到这是不可能的

要么你读的是错的,要么你误解了

虚拟关键字是如何工作的

当一个虚拟基准在层次中多次出现时,这些出现将合并到一个基准子对象中


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

你的假设可能是正确的,但不是那么容易

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

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

class A {
    int x;

public:
    A(int i) { x = i; }

private:
    void print() { cout << x; }
};
A类{
int x;
公众:
A(inti){x=i;}
私人:

void print(){cout你从哪里获取代码的?你从哪里读到不能调用祖父母方法的消息?请格式化你的代码。你在这里混淆了一些东西。其中之一是。你能提供这个假设的来源吗?