不可思议的C++,关于继承

原创 2006年05月19日 01:17:00

问题是这么来的:

    ATL的窗口实现机制主要思想是继承和模板,这样做的目的是避免虚函数运行时类结构增大(同样,MFC中为了实现消息映射和RTTI,同样没有采用虚函数机制,而是采用宏来达到这一目的)。一个简单的示例程序如下:

#include <iostream>
using namespace std;
template<class T>
class Base
{
public:
    Base(){};
    virtual ~Base(){};
    void func()
    {
        (static_cast<T*>(this))->func();
        cout << "Base" << endl;
    }
};
class Derived : public Base<Derived>
{
public:
    Derived() : Base<Derived>(){};
    void func()
    {
        cout << "Derived" << endl;
    }
};
int main(int argc, char* argv[])
{
    Base<Derived> *a = new Derived();
    a->func();
    delete a;
    system("pause");
    return 0;
}

输出结果:

        Derived
        Base

    注意,这里的func()并不是虚函数。巧妙之处在于对基类的thsi指针的强制转换。

    问题来了,如果在main中不是采用指针,而是采用基类对象,程序输出又会是怎样的?也许你会很快的回答,依然不变,因为这里没有采用虚函数机制。为此,程序进行了一下改动,如下:

#include <iostream>
using namespace std;
template<class T>
class Base
{
public:
    Base() {};
    virtual ~Base(){};
    void func()
    {
        (static_cast<T*>(this))->func();
        cout << "Base " << endl;
    }
};
class Derived : public Base<Derived>
{
public:
    Derived() : Base<Derived>(),n(3){};
    void func()
    {
        cout << "Derived " << n << endl;
    }
private:
 int n;
};
int main(int argc, char* argv[])
{
    Base<Derived> a;
    a.func();
    system("pause");
    return 0;
}

    让派生类的func()函数输出派生类的成员变量。现在你还能一下子说出结果吗?程序中只生成了基类的对象,而并没有生成派生类对象。但是基类仍然可以调用派生类的函数。

输出结果:

        Derived 1245104
        Base

    因为派生类的构造函数并没有被调用,所以n的值是随机的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 深入理解 虚继承、多重继承和直接继承

本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承、虚继承与多重继承,几个交叉概念,详细的阐释了继承、虚函数与虚继承的基本概念,深入剖析了继承于虚继承的区别...
  • u013630349
  • u013630349
  • 2015年07月25日 16:54
  • 6454

浅析C++继承与派生

测试环境: Target: x86_64-linux-gnu gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)  定义 要分析继承,首先...
  • qq_33724710
  • qq_33724710
  • 2016年06月11日 10:44
  • 2950

C++之单继承与多继承

继承性是面对对象程序设计中最重要的特征之一它允许在既有类的基础上创建新类,并可以根据所面对问题的不同情况对新类进行更具体,更详细的说明与操作。 通过代码看基类与派生类class A /...
  • qq_36782456
  • qq_36782456
  • 2017年04月13日 16:37
  • 1133

C++精进篇(九)之―继承及经典示例

继承是C++的重要属性:         在C++中有:         公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(p...
  • fanyun_01
  • fanyun_01
  • 2016年03月26日 09:20
  • 6080

【c++知识归纳】继承与多态(一)

c++是基于面向对象的编程语言,面向对象的三大特性为:封装、继承和多态。本文将我对继承与多态的理解进行了总结归纳,这部分内容对于学习c++编程语言是非常重要的,文章加入我的个人理解,希望能给大家带来帮...
  • XHfight
  • XHfight
  • 2016年08月24日 02:45
  • 1249

C++的三种访问权限与三种继承方式

三种访问权限我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。 父类:class Pers...
  • luoweifu
  • luoweifu
  • 2015年07月19日 11:10
  • 11308

C++模板类的使用和继承

定义一个类模板,注意两点: 1,类的定义前面使用关键词:template 2,函数的实现部分,在每个函数名的上一行也要加关键词template , 并且在函数名后面添加,例如 template...
  • taigw
  • taigw
  • 2014年01月14日 10:59
  • 2792

C++接口继承与实现继承的区别和选择

1.接口继承与实现继承的区别《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现; (2)虚函数既提...
  • K346K346
  • K346K346
  • 2017年02月13日 16:34
  • 609

C++学习之继承篇(多继承与多重继承)

1.多继承 多继承是指一个子类继承多个父类。多继承对父类的个数没有限制,继承方式可以是公共继承、保护继承和私有继承, 不写继承方式,默认是private继承 多继承举例: #inclu...
  • hudfang
  • hudfang
  • 2016年01月21日 18:55
  • 14096

C++异常与继承

在C++程序中,表示异常的类通常被组成为一个组(即如在前面各节讨论的那样)或者一个层次结构。 ◆ 1、例如:定义一个称为Excp的基类,由它来打印错误信息: class Excp { publ...
  • zk65645
  • zk65645
  • 2017年02月07日 19:48
  • 368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不可思议的C++,关于继承
举报原因:
原因补充:

(最多只允许输入30个字)