关于C++构造函数不被继承到派生类的疑惑
在VC++6.0上编译运行以下源代码:#include<iostream>usingnamespacestd;classMembers{public:Members():...
在VC++ 6.0上编译运行以下源代码:
#include<iostream>
using namespace std;
class Members
{
public:
Members():public_data(100),protected_data(1000),private_data(10000){}
Members(int a,int b,int c):public_data(a),protected_data(b),private_data(c)
{
cout<<"公共数据成员为:"<<public_data<<endl;
cout<<"保护数据成员为:"<<protected_data<<endl;
cout<<"私有数据成员为:"<<private_data<<endl;
}
pub_fun_trans_pro_and_pri_fun()
{
cout<<"公共成员函数调用保护成员函数显示各数据成员:\n";
protected_function();
cout<<endl;
cout<<"公共成员函数调用私有成员函数显示各数据成员:\n";
private_function();
}
void display_stars(){cout<<"******************************************"<<endl;}
void display_public_data(){cout<<"基类的公有数据成员为:"<<public_data<<endl;}
void display_protected_data(){cout<<"基类的保护数据成员为:"<<protected_data<<endl;}
void display_private_data(){cout<<"基类的私有数据成员为:"<<private_data<<endl;}
int public_data;
int public_function();
protected:
int protected_data;
int protected_function();
private:
int private_data;
int private_function();
};
int Members::public_function()
{
cout<<"公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
int Members::protected_function()
{
cout<<"保护成员函数通过公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"保护成员函数通过公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"保护成员函数通过公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
int Members::private_function()
{
cout<<"私有成员函数通过公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"私有成员函数通过公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"私有成员函数通过公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
class Members_son:public Members
{};
有人知道么? 展开
#include<iostream>
using namespace std;
class Members
{
public:
Members():public_data(100),protected_data(1000),private_data(10000){}
Members(int a,int b,int c):public_data(a),protected_data(b),private_data(c)
{
cout<<"公共数据成员为:"<<public_data<<endl;
cout<<"保护数据成员为:"<<protected_data<<endl;
cout<<"私有数据成员为:"<<private_data<<endl;
}
pub_fun_trans_pro_and_pri_fun()
{
cout<<"公共成员函数调用保护成员函数显示各数据成员:\n";
protected_function();
cout<<endl;
cout<<"公共成员函数调用私有成员函数显示各数据成员:\n";
private_function();
}
void display_stars(){cout<<"******************************************"<<endl;}
void display_public_data(){cout<<"基类的公有数据成员为:"<<public_data<<endl;}
void display_protected_data(){cout<<"基类的保护数据成员为:"<<protected_data<<endl;}
void display_private_data(){cout<<"基类的私有数据成员为:"<<private_data<<endl;}
int public_data;
int public_function();
protected:
int protected_data;
int protected_function();
private:
int private_data;
int private_function();
};
int Members::public_function()
{
cout<<"公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
int Members::protected_function()
{
cout<<"保护成员函数通过公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"保护成员函数通过公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"保护成员函数通过公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
int Members::private_function()
{
cout<<"私有成员函数通过公共成员函数显示公共数据成员:"<<public_data<<endl;
cout<<"私有成员函数通过公共成员函数显示保护数据成员:"<<protected_data<<endl;
cout<<"私有成员函数通过公共成员函数显示私有数据成员:"<<private_data<<endl;
return 0;
}
class Members_son:public Members
{};
有人知道么? 展开
3个回答
展开全部
其实很简单啊,也就是说,你必须要知道一个对象构造的时序。
假如:
class human
{};
class man : public human
{};
如果
man m;
构造的时候,是先调用human的构造函数,也就是基类的构造函数,然后才是man的构造函数,析构的时候先是调用派生类的构造函数,然后是基类的构造函数。
不过,我觉得你的那本书说的不够清楚,这里有些经典的C++数据推荐,也许能对你有帮助。
http://hi.baidu.com/idealsoft/blog/item/3269d3fa44679f9259ee9082.html
假如:
class human
{};
class man : public human
{};
如果
man m;
构造的时候,是先调用human的构造函数,也就是基类的构造函数,然后才是man的构造函数,析构的时候先是调用派生类的构造函数,然后是基类的构造函数。
不过,我觉得你的那本书说的不够清楚,这里有些经典的C++数据推荐,也许能对你有帮助。
http://hi.baidu.com/idealsoft/blog/item/3269d3fa44679f9259ee9082.html
2009-03-22
展开全部
接下来代码是:
int main()
{
cout<<"建立基类对象M(1,3,5),1,3,5分别为公有数据成员、保护数据成员和私有数据成员。\n";
Members M(1,3,5);
cout<<"类的所有成员(数据和函数)必须借助类的对象来调用!!\n";
cout<<"在类体外建立对象才能通过对象访问类的公有数据成员和公有函数,\n";
cout<<"但类的保护的和私有的数据与函数无法通过此对象访问。如有对象M\n";
cout<<"访问其公有数据成员的方式为:M.public_data,值为:"<<M.public_data<<endl<<endl;
cout<<"以下是通过公有成员函数M.public_function()显示三种访问属性的值:\n";
M.public_function();
cout<<endl;
cout<<"以下是分别通过公有成员数M.pub_fun_trans_pro_and_pri_fun()调用保护成员函数\n";
cout<<"和私有成员函数来显示三种访问属性的值:\n";
M.pub_fun_trans_pro_and_pri_fun();
cout<<endl<<endl;
cout<<"公有派生基类,不增加新成员(即除继承基类外{}内为空)并建立公有派生类对象Mm,注意\n";
cout<<"此对象未给出书面初始化数据,是因为构造函数和析构函数不能被派生类继承,而派生类\n";
cout<<"类体内也未给出用于对象初始化的构造函数。在这种情况下建立对象时给出书面初始值则\n";
cout<<"编译出错.\n";
Members_son Mm;
cout<<"通过Mm.display_stars()调用基类M中一个与基类数据成品无关的显示*号函数display_stars(),\n";
cout<<"结果如下:\n";
Mm.display_stars();
cout<<"可以看到基类的构造函数未被调用。\n";
cout<<"下面调用一下基类中单独显示公有数据的公有函数display_public_data(),运行结果如下:\n";
Mm.display_public_data();
cout<<"??怎么会调用到了基类的默认构造函数??\n";
cout<<"再试一下基类中单独显示保护数据的公有函数display_protected_data(),结果如下:\n";
Mm.display_protected_data();
cout<<"???也是这样呢???\n";
cout<<"最后试一下基类中单独显示私有数据的公有函数display_private_data(),结果如下:\n";
Mm.display_private_data();
cout<<"???????????怎么都被基类的默认构造函数给初始化了??难道书上都讲错了?????????\n";
return 0;
}
int main()
{
cout<<"建立基类对象M(1,3,5),1,3,5分别为公有数据成员、保护数据成员和私有数据成员。\n";
Members M(1,3,5);
cout<<"类的所有成员(数据和函数)必须借助类的对象来调用!!\n";
cout<<"在类体外建立对象才能通过对象访问类的公有数据成员和公有函数,\n";
cout<<"但类的保护的和私有的数据与函数无法通过此对象访问。如有对象M\n";
cout<<"访问其公有数据成员的方式为:M.public_data,值为:"<<M.public_data<<endl<<endl;
cout<<"以下是通过公有成员函数M.public_function()显示三种访问属性的值:\n";
M.public_function();
cout<<endl;
cout<<"以下是分别通过公有成员数M.pub_fun_trans_pro_and_pri_fun()调用保护成员函数\n";
cout<<"和私有成员函数来显示三种访问属性的值:\n";
M.pub_fun_trans_pro_and_pri_fun();
cout<<endl<<endl;
cout<<"公有派生基类,不增加新成员(即除继承基类外{}内为空)并建立公有派生类对象Mm,注意\n";
cout<<"此对象未给出书面初始化数据,是因为构造函数和析构函数不能被派生类继承,而派生类\n";
cout<<"类体内也未给出用于对象初始化的构造函数。在这种情况下建立对象时给出书面初始值则\n";
cout<<"编译出错.\n";
Members_son Mm;
cout<<"通过Mm.display_stars()调用基类M中一个与基类数据成品无关的显示*号函数display_stars(),\n";
cout<<"结果如下:\n";
Mm.display_stars();
cout<<"可以看到基类的构造函数未被调用。\n";
cout<<"下面调用一下基类中单独显示公有数据的公有函数display_public_data(),运行结果如下:\n";
Mm.display_public_data();
cout<<"??怎么会调用到了基类的默认构造函数??\n";
cout<<"再试一下基类中单独显示保护数据的公有函数display_protected_data(),结果如下:\n";
Mm.display_protected_data();
cout<<"???也是这样呢???\n";
cout<<"最后试一下基类中单独显示私有数据的公有函数display_private_data(),结果如下:\n";
Mm.display_private_data();
cout<<"???????????怎么都被基类的默认构造函数给初始化了??难道书上都讲错了?????????\n";
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
各位请帮忙运行一下为什么会出现运行后的疑问?书中所讲“基类的构造函数和析构函数是不被继承到派生类”这句话该怎么理解?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询