c++ 复杂类型指针 类指针 浅谈

来源:互联网 发布:mysql dmg for mac 编辑:程序博客网 时间:2024/06/05 18:54

晚上学习C++虚函数,在类指针指向问题上,卡壳了,其它的先不说,先看一段代码:

#include <iostream>

class Class1{

public:

    Class1(){

        a=1;

    }

    void print(){


        std::cout <<"Class1->print()\n";

    }

public:

    int a;

};

class Class2:publicClass1{

public:

    Class2(){

        a=2;

    }

    void print(){

        std::cout <<"Class2->print()\n";

    }

public:

    int a;

};

在这两个类中,Class2类公有继承了Class1类,并对父类中的成员函数和变量进行了覆盖。下面,进行两个语句。

    Class1 *c;

    Class2 d;  

    c=(Class1 *)&d;/

然后通过父类指针调用print()函数,即 c->print();  结果发现在这里调用的是父类中Class1中的print() 函数,甚是郁闷,搞不懂,为什么,思考片刻,终于想通。先看下面一条语句,Class1 *c; c->print();  程序不报错,并且可以顺利执行。但当我们执行c->a;这句话时,就会有问题。翻阅资料后,发现,

1. 类不占用内存,也不存在什么内存空间,只有在声明对象才开始有内存空间,声明指针依然不会有什么内存空间,
2. 函数不占用类对象的内存,即使不存在类对象,依然可以调用,只是不能访问成员变量。

至于之前出现的问题,调用c->print();这句话时,调用的是Class1中的函数,可知,指针调用普通成员函数,只与指针自身类型有关,而与其所指向的对象无关,如果想通过父类指针指向子类对象,来调用子类中被覆盖的方法,则需要把成员函数定义成虚函数;


0 0
原创粉丝点击