有些成员函数必须要定义?

femalelover 2006-09-27 03:04:08
我常常按照某些名著上说的去做:
如果要禁止某个方法被调用,那么就声明该方法为privata类型,并且不定义它.

现在产生了一个问题,下面的代码:
class CParent1
{
virtual void ShowNumber1(void); //不定义
};

class CParent2
{
virtual void ShowNumber2(void); //不定义
};

class CChild: public CParent1,public CParent2
{
virtual void ShowNumber2(void); //不定义
};

void main(void)
{
CParent1 *Parent1;
CParent2 *Parent2;
CChild *Child;
Child=new CChild;
Parent1 = Child;
Parent2 = Child;
printf ("%d, %d, %d", Parent1, Parent2, Child);
}
上面会报链接错误,有声明无定义那种.
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2006-09-27
  • 打赏
  • 举报
回复
怎么把分都给俺了。-_-
femalelover 2006-09-27
  • 打赏
  • 举报
回复
哦,明白了,谢谢.
晨星 2006-09-27
  • 打赏
  • 举报
回复
这话说的。。。

大多数编译器都把继承列表中第一个(即冒号后的第一个)基类对应的子对象放在子类对象的最前边。
而所谓“基类子对象”当然也是子类对象的一部分,所有第一个基类子对象的首地址当然也就是整个子类对象的地址。
femalelover 2006-09-27
  • 打赏
  • 举报
回复
谢谢,连晨星都光顾小弟的破帖了.

接着问题一下,俺不太懂C++内存模型, 上面的代码中 :

printf ("%d, %d, %d", Parent1, Parent2, Child);

会得到Parent1与Child的指针的首地址相同, 为什么呢?
晨星 2006-09-27
  • 打赏
  • 举报
回复
多打了一个“不”。应该是:“你故意不定义它……”。
晨星 2006-09-27
  • 打赏
  • 举报
回复
你不故意不定义它,那显然说明你根本不想用他,也不想别人用它,那还“virtual”干嘛?
如果你不想定义它,但想让子类定义它,应该使用纯虚函数。
weijiangshanwww 2006-09-27
  • 打赏
  • 举报
回复
class CParent1
{
virtual void ShowNumber1(void); //不定义
};

class CParent2
{
virtual void ShowNumber2(void); //不定义
};

class CChild: public CParent1,public CParent2
{
virtual void ShowNumber2(void); //不定义
};
改成:
class CParent1
{
private:
virtual void ShowNumber1(void){}; //不定义
};

class CParent2
{
private:
virtual void ShowNumber2(void){}; //不定义
};

class CChild: public CParent1,public CParent2
{
private:
virtual void ShowNumber2(void){}; //不定义
};
weijiangshanwww 2006-09-27
  • 打赏
  • 举报
回复
首先虚函数的主要作用是形成多态性,如果你没有定义,肯定会有错误,C中没定义的东西是不能使用的。
还有就是在编译的时候如果没有定义,编译器就无法正确的分配内存。
jixingzhong 2006-09-27
  • 打赏
  • 举报
回复
如果要禁止某个方法被调用,那么就声明该方法为privata类型,并且不定义它.
=================================
这个确实常用的方法,
比如无参构造函数,
通过自定义空函数, 并使之私有化,
可以防止意外调用构造,比如非预期的类型转化等 ~
sinall 2006-09-27
  • 打赏
  • 举报
回复
同意楼上看法。
adintr 2006-09-27
  • 打赏
  • 举报
回复
只声明不定义的不能是虚函数,
虚函数在建立虚函数表的时候需要函数的指针,有对函数的引用,连接会出错。
1 / 3(一) 大纲_Python 基础(3 天×6h) 课时:18 小时(6 小时×3 天)课程简介 本课程从零基础开始介绍 Python 编程知识,快速入门 Python 语言基础,循序渐进地掌握 Python 模块的构建和 Python 程序的代码的基本功能的实现。学员基础  了解计算机基本操作,掌握一般文字输入和处理的基础知识 了解计算机软件,硬件等基本概念课程目标  全面认识 Python,包括语言特点、应用领域、安装与执行原理、集成开发环境的使用等 掌握 Python 的基础语法,实现简单的程序编写 熟练使用 Python 的各种数据结构,掌握各自的适用场景 熟练使用模块和包,理解使用模块的好处,在工作中灵活借助模块实现需求课程内容 Python 概述及开发环境搭建 1.1 Python 应用领域 1.2 常见编程语言特点  Python 语言特点 面向对象与面向过程 编译型与解释型1.3 Python IDE 集成开发环境  PyCharm 安装及配置 Python 编程语言基础 2.1 库、包、模块 2.2 变量的定义及命名规范 2.3 书写规范 2.4 命名规范 2.5 运算符  算数运算符、逻辑运算符、赋值运算符、比较运算符、成员运算符、身份运算符2 / 3 运算符优先级 流程控制 3.1 流程控制语句结构 3.2 分支结构 if else 的语法结构及应用场景  多条件判断3.3 循环语句  for 语句 while 语句 嵌套循环 循环控制语句 跳出循环 常用数据类型及其函数 4.1 字符串 str 4.2 整数 int、浮点小数 float 4.3 布尔型 bool 4.4 列表 list  数值列表 range 数值列表转列表:list 函数 遍历列表 列表解析4.5 元组 tuple 4.6 字典 dict 4.7 集合 set 4.8 切片 4.9 在列表中存储字典 4.10 在字典中存储列表、字典 4.11 高级数据类型的运算 4.12 案例演练  练习:登录验证3 / 3 练习:遍历元组 练习:遍历集合 练习:while 循环列表 函数 5.1 函数的定义和作用  定义函数规范 调用函数5.2 函数的参数和返回值 5.3 局部变量与全部变量 5.4 位置参数与关键字参数 5.5 缺省参数与多值参数 5.6 数据的不可变类型与可变类型 5.7 常用内置函数  输出输入函数:print、input dir 函数 包与模块 6.1 了解库、包、模块 6.2 模块的导入方式  导入整个模块(.py) 导入模块中的函数 自定义模块的导入与应用6.3 定义别名 6.4 了解与制作包  导入包的方式6.5 常用标准库  time:日期时间计算 os:文件和目录处理

64,637

社区成员

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

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