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