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函数。
[解决办法]
书上说得没错,但你这里是拷贝构造函数,不是构造函数。在const &A a = b 的时候,实际上是传了一个完整的b给引用a,a引用的是一个完整的对象b,而调用虚函数的也正是这个完整的引用。
[解决办法]
在构造b1对象的时候,首先调用的是基类的拷贝构造函数,在调用的时候传的参数是对象b,根据兼容性原则,基类对象可以接收派生类对象,所以此时仍是用的派生类对象调用的info.
所以显示的是In B
