晚上学习C++虚函数,在类指针指向问题上,卡壳了,其它的先不说,先看一段代码:
#include <iostream>
class Class1{
public:
Class1(){
a=1;
}
void print(){
std::cout <<"Class1->print()\n";
}
public:
int a;
};
class Class2:public Class1{
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中的函数,可知,指针调用普通成员函数,只与指针自身类型有关,而与其所指向的对象无关,如果想通过父类指针指向子类对象,来调用子类中被覆盖的方法,则需要把成员函数定义成虚函数;