帮忙解释一段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;
} 展开
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;
} 展开
1个回答
展开全部
这段代码主要是为了说明如何使用虚函数来实现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的相应代码。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询