首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C ++ 中调用构造函数解决思路

2013-01-23 
C ++ 中调用构造函数#include iostream using namespace stdclass A{public:A(int a 0):x(a) { cout

C ++ 中调用构造函数

#include <iostream> 
using namespace std;    

class A{
public:
A(int a = 0)
:x(a) { cout<<"called construction."<<endl;}
A(const A &a)
{
x=a.x;
cout<<"called copy construction."<<endl;
a.info();
}
virtual void info()const
{
cout<<"In A"<<endl;
}
int getX()
{
return x;
}
protected:
int x;
};

class B : public A{
public:
B(int a=0,int b=0)
:A(b),y(b){}
B(const B &b)
{
A::A(b);
y=b.y;
}
virtual void info()const
{
cout<<"In B"<<endl;
}
int getY()
{
return y;
}
private:
int y;
};

int main()  
{   
B b(1,2);
B b1(b);
return 0; 




这个例子中为什么调用了两次 A的构造函数? 
还有最后打印出了 In B, 应该是In A吧,因为在A赋值构造函数中,此时的b1还不完整,不是说此时的赋值构造将a看做A的对象,应该调用A中的info()函数吧。 class
[解决办法]
两次A构造函数:
第1次:B b(1,2);的时候需要先调用父类的构造函数。
第2次:B b1(b);时,先调用父类的构造函数,再调用B类的拷贝构造函数。

印出In B:在调用拷贝构造函数时,传给A(const A &a)的实际上是一个B类对象,由于info是虚函数,具有多态性,所以实际调用的是B类中的Info函数。
[解决办法]
引用:
引用:两次A构造函数:
第1次:B b(1,2);的时候需要先调用父类的构造函数。
第2次:B b1(b);时,先调用父类的构造函数,再调用B类的拷贝构造函数。

印出In B:在调用拷贝构造函数时,传给A(const A &amp;amp;a)的实际上是一个B类对象,由于info是虚函数,具有多态性,所以实际调用的是B类……
书上说得没错,但你这里是拷贝构造函数,不是构造函数。在const &A a = b 的时候,实际上是传了一个完整的b给引用a,a引用的是一个完整的对象b,而调用虚函数的也正是这个完整的引用。
[解决办法]
在构造b1对象的时候,首先调用的是基类的拷贝构造函数,在调用的时候传的参数是对象b,根据兼容性原则,基类对象可以接收派生类对象,所以此时仍是用的派生类对象调用的info.
所以显示的是In B

热点排行
Bad Request.