C++ PRIMER 上这句话什么意思

SKATE11 2013-06-09 05:27:01
#include <iostream>
using namespace std;

class Base
{
public:
Base()
{
x = 10;
y = 20;
}

virtual void print()
{
cout<<" x = "<<x<<" y = "<<y<<endl;
}

public:
int x;
int y;
};

class Inh : public Base
{
public:
Inh(int xx, int yy, int zz):x(xx), y(yy),z(zz) //错误在这
{
}
void print()
{
Base::print();
cout<<"z = "<<z<<endl;
}
private:
int z;
};

int main()
{
Inh tst(1,2,3);
Base& vs =tst;
vs.print();
return 0;
}

问题1:初始化列表为什么不能初始化从基类继承而来的成员变量?
问题2:C++ PRIMER上在谈到引用时说“非CONST引用只能引用同类型的对象” 那么我们最常用的多态不也是用指针和引用来实现的吗!并没有加const ,如:Base& vs =tst; 这也不是同类型啊。
...全文
311 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WK_ITing 2013-06-12
  • 打赏
  • 举报
回复
第一个问题: 基类的构造函数没有参数列表,所以无需在派生类的构造函数上给基类的数据成员赋值。可以在派生类的构造函数内部给基类的数据成员进行赋值。(注意:数据成员一般私有,这样才能体现封装性) 第二个问题: 派生类对象赋给基类的引用,是多态的体现形式。就像汽车可以说成是车,而如果你把车说成是汽车,那就说不过去了。
forget0915 2013-06-11
  • 打赏
  • 举报
回复

//派生类的构造函数该这么写
	Inh(int xx, int yy, int zz)//:x(xx), y(yy),z(zz) //错误在这
	{
		Base();
		x=xx;
		y=yy;
		z=zz;
	}
大尾巴猫 2013-06-10
  • 打赏
  • 举报
回复
问题1:初始化列表为什么不能初始化从基类继承而来的成员变量? 基类的成员变量,自然有基类的构造函数去负责初始化。 派生类只要调用基类的构造函数,让基类去完成这个事情。 这就是面向对象的思想。我只告诉你去做这件事,我只要结果。至于怎么做,我不干涉。
DoDoWu2013 2013-06-10
  • 打赏
  • 举报
回复
引用 5 楼 ZLhy_ 的回复:
问题1:初始化列表为什么不能初始化从基类继承而来的成员变量? 你的派生类里面在参数初始化列表里调用的是A类的带参构造函数,但是A中没有这种函数啊,派生类能调用的也都是基类里面有的才行。 问题2:C++ PRIMER上在谈到引用时说“非CONST引用只能引用同类型的对象” 那么我们最常用的多态不也是用指针和引用来实现的吗!并没有加const ,如:Base& vs =tst; 这也不是同类型啊。

//测试“非CONST引用只能引用同类型的对象” 
void Testconstref()
{
	int i = 1;
	//float &f = i;  //编译错误,不能把int类型转换为float&类型
	const float &f2 = i;  //但是这个可以了,因为是const 引用了
	//以上真机上测试的
}
多态中,派生类可以被当成是基类来使用其属于基类的功能,就好比说学生是人一样,人这个类的属性和行为同样在学生这个类中说的通,行得通。他们是在多态意义上的解释,和“非CONST引用只能引用同类型的对象” 这句话关系不大了
支持
qq453345496 2013-06-10
  • 打赏
  • 举报
回复
里边提到要尊重基类
疯狂的红豆 2013-06-09
  • 打赏
  • 举报
回复
问题1:初始化列表为什么不能初始化从基类继承而来的成员变量? 你的派生类里面在参数初始化列表里调用的是A类的带参构造函数,但是A中没有这种函数啊,派生类能调用的也都是基类里面有的才行。 问题2:C++ PRIMER上在谈到引用时说“非CONST引用只能引用同类型的对象” 那么我们最常用的多态不也是用指针和引用来实现的吗!并没有加const ,如:Base& vs =tst; 这也不是同类型啊。

//测试“非CONST引用只能引用同类型的对象” 
void Testconstref()
{
	int i = 1;
	//float &f = i;  //编译错误,不能把int类型转换为float&类型
	const float &f2 = i;  //但是这个可以了,因为是const 引用了
	//以上真机上测试的
}
多态中,派生类可以被当成是基类来使用其属于基类的功能,就好比说学生是人一样,人这个类的属性和行为同样在学生这个类中说的通,行得通。他们是在多态意义上的解释,和“非CONST引用只能引用同类型的对象” 这句话关系不大了
SKATE11 2013-06-09
  • 打赏
  • 举报
回复
引用 2 楼 hugett 的回复:
基类的成员要用基类的构造函数初始化。。
那第二个问题呢
SKATE11 2013-06-09
  • 打赏
  • 举报
回复
引用 1 楼 ynwlgh 的回复:
明显重复了啊,你基类也有初始化表啊.
不都是赋值吗 怎么重复不行呢
hugett 2013-06-09
  • 打赏
  • 举报
回复
基类的成员要用基类的构造函数初始化。。
ynwlgh 2013-06-09
  • 打赏
  • 举报
回复
明显重复了啊,你基类也有初始化表啊.
 学习C++重在理解其各种语言设施所代表的语义,以及C++所能表示的语义所代表的设计思想。首先从宏观上入手,你需要明白的是C++是程序设计语言的本质。在此我把C++最重要的性质写下来:C++是一门静态类型检查,基于C内存模式,支持四种基本程序设计范型的语言。注意,这里说明了三个本质特性,静态说明了语言的类型检查性质,基于C内存模式告诉我们在C++中所有与内存有关的操作都需要程序员自己来负责,这样就带来了很多设计程序时的需要注意的地方,而理解支持的四种基本范型却是理解各种语言设施的基础。然后记住C++的最大的一点设计哲学,也是其贯穿应用C++的一条本质,我引用《C++ PRIMER》中文版前言内的一句表示--“C++的基础是各种设施,它们让用户能够通过定义新的数据类型来扩展语言本身,这些新类型可以与内置类型一样的使用方式(如何理解这句是关键,我的理解是:用户定义类型可以在任何使用内置类型的时候做为其替代,再具体点说就是用户定义类型可以象内置类型那样可以被声明,其对象可以被初始化,可以相互复制,可以象内置类型对象那样和很多操作符一起使用,可以被作为参数传递给函数,可以作为函数的返回值,可以作为容器的操作对象,用户定义类型可以和内置类型一样作为模板的参数),掌握这些设施(哪些设施?就是让用户定义类型可以和内置类型一样方便使用的设施,包括什么?构造,拷贝,解构函数,操作副重载.....)的第一步就是理解基本语言(什么是基本语言?就是C++中better c部分)。

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧