帮忙解释一段c++程序,最好带注释~谢谢

#include<iostream>usingnamespacestd;classA{public:A(){cout<<"A::A()called.\n";}virtua... #include <iostream>
using namespace std;
class A
{public:
A(){cout<<"A::A() called.\n";}
virtual ~A(){cout<<"A::~A() called.\n";}
};
class B: public A
{public:
B(int i)
{ cout<<"B::B() called.\n";
buf=new char[i];
}
virtual ~B()
{ delete []buf;
cout<<"B::~B() called.\n";
}
private:
char *buf;
};
int main()
{ A *a=new B(15);
delete a;
return 0;
}
展开
 我来答
博迷月听鸟09
2019-02-28 · 超过21用户采纳过TA的回答
知道答主
回答量:39
采纳率:55%
帮助的人:28.2万
展开全部

这段代码主要是为了说明如何使用虚函数来实现C++中的多态,具体的说,在这个例子里实现了通过基类(A)指针访问了派生类(B)的成员函数(B的析构函数)。如果不是很懂的话请继续我加在代码里的注释。

#include <iostream>
using namespace std;
class A  // 定义基类A
{
    public:
    A() // A的构造函数。你实例化一个A类的对象时:
        // 诸如 A x = A(), 将会打印下面cout中的语句
    { 
        cout<<"A::A() called.\n";
    }
    virtual ~A() // 定义了虚的A的析构函数。当你 delete x 的时候执行
    {
        cout<<"A::~A() called.\n";
    }
}; 

class B: public A // 定义由A类派生出的子类B
{
    public:
    B(int i) // 这是B的构造函数,允许你在创建B对象的时候传入一个int参数
             // 这个int i会在创建后直接保存到B中的buf对象中。
    { 
        cout<<"B::B() called.\n";
        buf=new char[i];
    }
    virtual ~B() // 同样的这是B的析构函数,特别地,这里注明了销毁B对象的时候
                 // 还需要清空掉B中的buf数据
    {
        delete []buf; 
        cout<<"B::~B() called.\n";
    }
    private: // B 中的私有对象buf
    char *buf;
};

// 以上都是C++中类的定义,并没有很大特别之处。
// 下面的调用是精髓部分,请额外注意

int main()

    A *a=new B(15); // 这里定义了一个A类的指针a
                    // 但是这个指针是指向A的子类B的!
    delete a;       // 这里必然会调用析构函数,但是问题是调用的是
                    // 这个指针原本的类别(A类的)的析构函数?
                    // 还是它实际指向的类别(B)的析构函数呢?
    return 0;
}

// 执行这段代码就会知道答案是后者,delete a 会调用B的析构函数,
// 打印"B::~B() called.\n", 然后销毁掉a对象。

为什么说虚函数“虚”,就是因为你无法在编译过程中得知到底“delete a”会调用那个函数。必须在执行的时候看到a实际指向的不是A,而是B,再去执行B的相应代码。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式