请问下面程序的输出结果为什么是c?

#include <iostream>
using namespace std;
class A{
    public:
    virtual Print()
    {
        cout<<"a";
     } 
}; 
class B:public A{
    public:
    Print()
    {
        cout<<"b";
    } 
}; 
class C:public B{
    public:
    Print()
    {
        cout<<"c";
     } 
}; 
int main()
{
    A *a;
    C c;
    a=&c;
    a->Print(); 
    return 0;

}

因为继承关系是A>B>C
a=&c表明使用的是C的实例

同理

  A *a;
    B b;    
    a = &b;
    a->Print();

上面将输出b

  B *b;
    C c;
    b = &c;
    b->Print();

这段输出c

你首先创建了指针a,是一个可以指向A类及其派生类的指针,然后声明了一个A类的派生类C的对象c,并将其的地址赋给了指针a。此时a是A类的指针,但实际上指向的是A类的派生类C的对象。在调用Print()函数时,C类的函数覆写了其基类的函数,所以虽然a是A类的指针,但实际上调用的是派生类C类的函数。

A类定义的是虚函数,所以使用指针的时候会调用指针指向的C类对象的Print()函数。
可以直接百度C++虚函数了解相关信息

A是一个类,他和后面的不同他是一个方法,后面的B,C类调用他,并改写Print()函数,而后面的这个A是里面的方法而a只是一个容器,
C c和a = &c这两行代码是改写a里的内容因此结论出执行的是C的Print();

可以理解为A->a C->c a->c因此中间有变量把错误过滤掉