C++ Primer — const小问题
2013-11-09 22:02
155 查看
#include <iostream> using namespace std; class Base { public: virtual void display() const { cout << "Base class !" << endl; } virtual ~Base(){} }; class Derive: public Base { public: virtual void display() { cout << "Derive class !"<< endl; } virtual ~Derive(){} }; int main() { Base* pBase = new Derive(); Derive* pDerive = new Derive(); pBase->display(); pDerive->display(); delete pBase; delete pDerive; //const Derive d; //d.display();//编译错误 return 0;}
该程序会输出:Base class和Derive class。但是如果在子类成员函数加上const的话,输出为2个Derive class。还可以父类不加const,子类加const等。
注解:基类和派生类的display函数一个带const,一个不带const,虽然基类中disppaly()函数为虚函数,但是派生类中的dispaly()函数没有const修饰,也就是说派生类中的display()函数,并不是对基类中display()函数的重新定义,派生类中有2个版本的display()函数,一个是继承基类的,一个是自己的,我们不能通过Derive的对象(引用或指针)调用从Base继承的虚函数,因为该函数被Derive中的display()定义屏蔽了,pBase是基类类型的指针,它指向派生类,当调用display()函数时,这是不会发生动态绑定,编译器将在基类中查找该函数,而忽略派生类;若将派生类中的dispay()函数加上const修饰,即对display()函数进行重定义,则当通过基类类型的指针调用dispaly()函数时,此时发生动态绑定,会根据基类类型的指针实际指向的对象来调用相应的函数,故此时会输出2个Derive
class
相关文章推荐
- 【Qt开发】几个傻不拉几关于char*和const char*的不兼容问题
- 函数形参数中,用double还是const double &,这是一个问题。
- C++ Primer 笔记五 引用(const)1
- 十二章 类————初始化const或引用类型要用初始化列表,隐式转换问题等,友元
- C++ static、const对象声明与定义 问题来源?
- C++ static、const对象声明与定义 问题 最终解决了
- cocos2d-x 关于 std::string 与 const char* 之间转换的奇怪问题
- const 初始化问题
- const char to LPCTSTR不能转化问题
- 【转】C++的const_cast的问题
- C++中const用法(3)——引用形参问题
- 关于Vc2005中头文件的static const int问题
- 「C++ Primer」3.22 迭代器未定义操作导致段错误问题
- const和指针的交叉问题
- [C++ Primer] 第四章的若干问题
- 求助:关于const修饰模板参数的问题
- 关于“LPCSTR和const char *不兼容的问题”的解决方法
- ASSERT()和assert() | const,static和volatile要注意的几个问题 |define宏与const区别
- C++ const成员初始化问题
- C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”