C++类的继承的成员初始化问题: 5
#include<iostream>usingnamespacestd;classA{private:intn_point;public:inti_point;A(int...
#include <iostream>
using namespace std;
class A
{
private:
int n_point;
public:
int i_point;
A(int n):n_point(n),i_point(20)
{
cout<<"A的构造函数"<<endl;
}
void pr()
{
cout<<n_point<<'\t'<<i_point<<'\t';
}
};
class B:public A
{
int a_point;
public:
B(int n,int a):A(n),a_point(a),i_point(15)
{
cout<<"B类的构造函数"<<endl;
// i_point=15;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
int main()
{
A a(10);
B b(5,25);
a.pr();
cout<<endl;
b.pr();
}
在类B中,继承了A类,那A类中的public成员i_point为什么不能在B类的构造函数后面引用参数列表来赋值呢?而必须在类B的构造函数的函数体中进行初始化? 展开
using namespace std;
class A
{
private:
int n_point;
public:
int i_point;
A(int n):n_point(n),i_point(20)
{
cout<<"A的构造函数"<<endl;
}
void pr()
{
cout<<n_point<<'\t'<<i_point<<'\t';
}
};
class B:public A
{
int a_point;
public:
B(int n,int a):A(n),a_point(a),i_point(15)
{
cout<<"B类的构造函数"<<endl;
// i_point=15;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
int main()
{
A a(10);
B b(5,25);
a.pr();
cout<<endl;
b.pr();
}
在类B中,继承了A类,那A类中的public成员i_point为什么不能在B类的构造函数后面引用参数列表来赋值呢?而必须在类B的构造函数的函数体中进行初始化? 展开
4个回答
展开全部
根据C++类的规则:
派生类的构造函数只能初始化自己的成员,而不能初始化基类的成员。
当然,有时派生类从基类继承了成员,它也可以初始化其从基类继承的成员。
这时要用构造函数初始化列表中包含基类名及其从基类继承的成员:即上例中的A(n)。
至于你所说的赋值情况,只是在派生类中访问基类的公有成员的特例,不属于成员初始化工作。
i_point是类A中public成员,所以能对其进行赋值操作,这并不是派生类构造函数工作的一部分。
另外,类的数据成员,一般应为私有。所以你的程序改为如下更好些:
#include <iostream>
using namespace std;
class A
{
private:
int n_point;
int i_point;
public:
A(int n,int i):n_point(n),i_point(i)
{
cout<<"A的构造函数"<<endl;
}
void pr()
{
cout<<n_point<<'\t'<<i_point<<'\t';
}
};
class B:public A
{
int a_point;
public:
B(int n,int i,int a):A(n,i),a_point(a)
{
cout<<"B类的构造函数"<<endl;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
int main()
{
A a(10,20);
B b(5,15,25);
a.pr();
cout<<endl;
b.pr();
}
派生类的构造函数只能初始化自己的成员,而不能初始化基类的成员。
当然,有时派生类从基类继承了成员,它也可以初始化其从基类继承的成员。
这时要用构造函数初始化列表中包含基类名及其从基类继承的成员:即上例中的A(n)。
至于你所说的赋值情况,只是在派生类中访问基类的公有成员的特例,不属于成员初始化工作。
i_point是类A中public成员,所以能对其进行赋值操作,这并不是派生类构造函数工作的一部分。
另外,类的数据成员,一般应为私有。所以你的程序改为如下更好些:
#include <iostream>
using namespace std;
class A
{
private:
int n_point;
int i_point;
public:
A(int n,int i):n_point(n),i_point(i)
{
cout<<"A的构造函数"<<endl;
}
void pr()
{
cout<<n_point<<'\t'<<i_point<<'\t';
}
};
class B:public A
{
int a_point;
public:
B(int n,int i,int a):A(n,i),a_point(a)
{
cout<<"B类的构造函数"<<endl;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
int main()
{
A a(10,20);
B b(5,15,25);
a.pr();
cout<<endl;
b.pr();
}
展开全部
要把基类看成一个成体,构造B对象时要调用A的构造函数,不能单独对A中的成员初始化,
在函数体中是对其赋值,对象已经构造好!
在函数体中是对其赋值,对象已经构造好!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
派生类的构造函数只能初始化自己的成员,而不能初始化基类的成员。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-04-26
展开全部
可以这样
class B:public A
{
int a_point;
public:
B(int n,int a):A(n),a_point(a)
{
i_point = 15;
cout<<"B类的构造函数"<<endl;
// i_point=15;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
class B:public A
{
int a_point;
public:
B(int n,int a):A(n),a_point(a)
{
i_point = 15;
cout<<"B类的构造函数"<<endl;
// i_point=15;
}
void pr()
{
A::pr();
cout<<a_point<<endl;
}
};
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询