子类如果重新定义了父类的non-virtual函数则不会有多态效果。

为方便描述,这里的方法和继承方式都用public。至于原因嘛,你懂的!

1:子类直接继承父类方法

class BaseOption
{
public:
void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
}; int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
 BaseOption *pBase = &obj;  SubOption *pSub = &obj;  pBase->Function();
 
pSub->Function();
}

输出:

"BaseOption::Function()"
"BaseOption::Function()"

这里使用BaseOption 和SubOption 调用Function都能调进BaseOption::Function();

2:为了实现多态效果,把父类Function()改为virtual,在子类中重新实现

class BaseOption
{
public:
virtual void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
public:
void Function();
}; void SubOption::Function()
{
cout<<"SubOption::Function()"<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
 BaseOption *pBase = &obj;  SubOption *pSub = &obj;   pBase->Function();  pSub->Function();
}

这就是我们常说的多态。

输出:
"SubOption::Function()"
"SubOption::Function()"

3:子类直接重新定义父类non-virtual方法,这背时的做法,在这种情况下就没有了多态属性,至于这种设计方法的弊端,没得说。

class BaseOption
{
public:
void Function();
}; void BaseOption::Function()
{
cout<<"BaseOption::Function()"<<endl;
} class SubOption :
public BaseOption
{
public:
void Function();
}; void SubOption::Function()
{
cout<<"SubOption::Function()"<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
SubOption obj;
BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}

输出:
BaseOption::Function()

SubOption::Function()

虽然实例对象时SubOption obj,但在调用时候 由BaseOption指针pBase会调进BaseOption中,这也是哦,SubOption is-a BaseOption .

c++ 子类切勿重新定义父类 non-virtual函数的更多相关文章

  1. c++ 切勿重新定义继承来的带缺省参数的函数

    切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...

  2. C++ 子类继承父类纯虚函数、虚函数和普通函数的区别

    C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...

  3. C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good

    C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术 ...

  4. 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数

    我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...

  5. 转:C++:从子类访问父类的私有函数

    众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...

  6. 子类父类(虚函数下的 引用指针 对象)->看来没有子类指针这回事

    #include<iostream> using namespace std; class Father { public: Father() { cout << " ...

  7. c++ 子类构造函数初始化及父类构造初始化

    我们知道,构造方法是用来初始化类对象的.如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数:并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建. 构造函数与 ...

  8. ecshop设置一个子类对应多个父类并指定跳转url的修改方法

    这是一篇记录在日记里面的技术文档,其实是对ecshop的二次开发.主要作用是将一个子类对应多个父类,并指定条跳转url的功能.ecshop是一款在线购物网站,感兴趣的可以下载源码看看.我们看看具体是怎 ...

  9. Linq:切勿使用 Count() > 0 来判断集合非空

    原文(http://www.cnblogs.com/ldp615/archive/2011/12/11/2284154.html) Linq 出现之前,我们通常使用下面的方式来判断集合是否非空,即集合 ...

随机推荐

  1. JavaScript--收藏栏添加按钮,放大hdu题目字体

    觉得HDOJ的题目字体太小了,一波小操作 在收藏栏添加:添加网页->网址改为: javascript: void((function() { var element = document.get ...

  2. jquery ajax中使用jsonp的限制(转)

    http://www.cnblogs.com/dudu/archive/2012/12/04/jquery_ajax_jsonp.html jsonp 解决的是跨域 ajax 调用的问题.为什么要跨域 ...

  3. Django 登录页面重定向

    转自:http://blog.chedushi.com/archives/3484 登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面. 比如用户正在浏览一篇文章,发 ...

  4. AtCoder Beginner Contest 087 D - People on a Line

    Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There are N people sta ...

  5. LintCode Sliding Window Matrix Maximum

    原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of n ...

  6. python IOError: cannot identify image file

    转:http://blog.csdn.net/sinat_25704999/article/details/50118465

  7. php 数组NULL元素的批量处理

    $a = array('a'=>1, 'b'=>0, 'c'=>NULL); foreach($a as $k=>$v) {  // if( is_null($a[$k]))  ...

  8. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  9. eclipse -- propedit 安装.

    SSH 项目中.用到国际化文件,Message.properties 但里面的文本都是 unicode 格式的,用起来不谁.而且也不想通过其它工具转码来使用. 可以通过安装 eclipse 的 pro ...

  10. Sql server big data如何批量update数据

    原因: 要一次性update 2千万条数据,虽然update sql很简单,但是由于一次性修改太多的数据,造成数据库log满了,就会报error: [ErrorCode: 9002, SQL Stat ...