c++ 复杂类型指针 类指针 浅谈
2015-07-26 08:56
239 查看
晚上学习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中的函数,可知,指针调用普通成员函数,只与指针自身类型有关,而与其所指向的对象无关,如果想通过父类指针指向子类对象,来调用子类中被覆盖的方法,则需要把成员函数定义成虚函数;
#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中的函数,可知,指针调用普通成员函数,只与指针自身类型有关,而与其所指向的对象无关,如果想通过父类指针指向子类对象,来调用子类中被覆盖的方法,则需要把成员函数定义成虚函数;
相关文章推荐
- C++生产和使用的临时对象
- 对于程序性能优化的理解
- 对于程序性能优化的理解
- C++面向对象编程(五)同名成员变量和同名函数
- 【C++探索之旅】第一部分第三课:第一个C++程序
- 【C++探索之旅】第一部分第二课:C++编程的必要软件
- C++运算符详解问题详解
- 《C++编程思想》(第二版)第3章 C++中的C(笔记、习题及答案)(二)
- 基于Qt5.5.0的sql,C++备忘录软件的编写
- 浅谈C语言嵌入式系统编程注意事项
- C语言int类型指针指向char类型变量简单实例
- C语言中对文件的操作
- 深入搜索C++对象模型------构造函数
- C++学习,总结一
- C++11 -----一切从lambda说起
- C++实现禁忌搜索解决TSP问题
- C语言中数组与指针的结合
- Souvenir
- [C Language] 回调函数
- [C++学习笔记]--位运算、引用、const指针